今天看jdk中类的源码,有很多地方是通过对位的操作来改变数值。之前也看过,现在仅对ava中位操作记录一下,以免日后混淆不清。
大伙都知道,计算机世界里只有 0 和 1,因为数字集成电路由晶体管构成,晶体管的开关特性让输出端和输入端只能是高低电平。一个电信号端口就是一位(bit),8个并一排就是8位,也叫一字节(byte)。计算机中计算它的二进制数,我们习惯十进制。所以就有一个转换过程。
值有正、负和0之分,以java 中 int 类型为例,四字节32位。表示0时,32个0
计算机中表示正数时,最高位为0,表示负数时,最高位为1,这样转换过来的二进制码叫【原码】。
原码如果保留符号位(最高为)不变,其它位依次取反,这样表示出来的二进制码叫【反码】。
在反码的基础上,最低位 加 1,这样表示出来的二进制码叫【补码】,这才是计算机运算和存储的二进制数表示方法。
综上所述:正数的原码,反码,补码都一样。负数的就有点搞人了。。。。。。计算机中计算补码,是有原因的。可自行搜索看看。
7 的补码 00000000000000000000000000000111
-7 的补码 11111111111111111111111111111001
9 的补码 00000000000000000000000000001001
1、与(&) --有0为0
0111 | 1001 = 0001
2、或(|) --有1为1
0111 & 1001 = 1111
3、非(~) --1和0 互换
~ 0111 = 1000
4、异或(^) --相同为0,不同为1
0111 ^ 1001 = 1110
5、左移(<<)
7 << 1 = 00000000000000000000000000001110
7 << 2 = 00000000000000000000000000011100
-7 <<1 = 11111111111111111111111111110010
-7 <<2 = 11111111111111111111111111100100
左移末位补0,移动32位会回到原数值。
一般常说左移n位是乘2的n次方倍,但是在一定情况下,正数可以移成负数哦。
6、右移(>>)
正数右移,末位移除,高位补0
7 >> 1 = 00000000000000000000000000000011
7 >> 2 = 00000000000000000000000000000001
7 >> 3 = 00000000000000000000000000000000
负数右移,末位移除,高位补1
-7 >> 1 = 11111111111111111111111111111100
-7 >> 2 = 11111111111111111111111111111110
-7 >> 3 = 11111111111111111111111111111111
同样移动32位会回到原数值。
7、带符号右移(>>>)
7 >>> 1 = 00000000000000000000000000000011
7 >>> 2 = 00000000000000000000000000000001
7 >>> 3 = 00000000000000000000000000000000
-7 >>> 1 = 0111111111111111111111111111100
-7 >>> 2 = 00111111111111111111111111111110
-7 >>> 3 = 00011111111111111111111111111111
以上二进制表示的都是【补码】方式。先 -1 成反码,然后保留符号位,其它位依次取反就是原码,再转化为十进制即可。
比如:11111111111111111111111111111001 补码
减 1 为 11111111111111111111111111111000 反码
保留符号位,其它依次取反 为 10000000000000000000000000000111 原码 即为十进制 -7
位数较多,可能有误,若有发现,烦请指出。敲的不易。。。。。