前言

今天突然有一个需求用到了位运算符,然后让我好好的回忆了一下java基础,说实话我真的把位运算符的相关方法忘的死死的。所以为了纪念逝去的时光,写下了这篇基础中的基础,也算是给自己提个醒要时不时的去回去看看基础,要不然都没有进步的空间了。

正文

基础的东西基本上都是看一眼就能想起来的。比如下边这一眼。

位运算符的列表:

名称

符号

左移

<<

空位补0,被移除的高位丢弃,空缺位补0。

右移

>>

被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。

无符号右移

>>>

被移位二进制最高位无论是0或者是1,空缺位都用0补。

按位与

&

二进制位进行&运算,只有1&1时结果是1,否则是0;

按位或

|

二进制位进行

按位异或

^

相同二进制位进行 ^ 运算,结果是0; 1^ 1=0 , 0^ 0=0不相同二进制位 ^ 运算结果是1。 1^ 0=1 , 0^1=1

按位取反

~

正数取反,各二进制码按补码各位取反。负数取反,各二进制码按补码各位取反

分开来解释如下:

左移

Java基础——很少用的位运算符_位运算符

右移

Java基础——很少用的位运算符_补码_02

无符号右移

Java基础——很少用的位运算符_位取反_03

按位与

Java基础——很少用的位运算符_位运算符_04

按位或

Java基础——很少用的位运算符_位运算符_05

按位异或

Java基础——很少用的位运算符_补码_06

按位取反

Java基础——很少用的位运算符_位取反_07

这是因为整数在计算机中是二进制存储的。

java中 ~5=-6 ,而这个-6是输出到屏幕上,我们看到的是-6。

首先看对5求反,

5的二进制原码是:0000 0000 0101,

取反之后是:1111 1111 1010 ,得到的这个值在计算机中的存储原型也是 1111 1111 1010,而要把这个结果显示出来,到计算机屏幕上就要转换成十进制,也就是说 1111 1111 1010 是补码形式,

补码 = 原码取反 + 1。

补码要换算成对应的十进制就是

原码取反 = 补码 -1

所以1111 1111 1010 - 1 = 1111 1001, 然后再对1111 1111 1001 取反,得到 1000 0000 0110,

所以 原码就是 1000 0000 0110,对应的十进制就是 -6。

同样的,这样看也行:

-6在计算机中的存储为二进制补码形式,也就是说-6的补码是 1000 0000 1010 (-6的二进制原码是:1000 0000 0110,源码取反之后是 1111 1111 1001,再加上1就是 1111 1111 1010,这就是补码了)。

结束

本来感觉这篇文章应该是个水文,可是写到最后感觉没有那么简单,所以又重新把,反码,补码的相关内容看了一遍,(ps:真心不想看的,可谁知道这个按位取反给我整懵了呢【捂脸哭】)。总的来说这个逻辑还是很重要的。所以计算机组成原理,早就不知道让我给忘到哪去了。