Java 按位操作
1.正负数的二进制表示形式
int 32位
15的原码:00000000 00000000 00000000 00001111
反码:00000000 00000000 00000000 00001111
补码:00000000 00000000 00000000 00001111
-15:原码:10000000 00000000 00000000 00001111
反码:11111111 11111111 11111111 11110000
补码:11111111 11111111 11111111 11110001
-2:原码:10000000 00000000 00000000
00000010
反码:11111111 11111111 11111111
11111101
+1(逢二进一)
补码:11111111 11111111 11111111
11111110
计算机数字是以补码储存的
一个数为正,则它的原码、反码、补码相同
一个数为负,则符号位为1,其余各位是对原码取反,然后整个数加1
第一位为符号位 0正 1负
1. ---
15的原码:00000000 00000000 00000000 00001111
-15的原码 10000000 00000000 00000000 00001111
-15反码:11111111 11111111 11111111 11110000
+1
-15:11111111 11111111 11111111 11110001
1原码:00000000 00000000 00000000 0000001
-1 原码:10000000 00000000 00000000 0000001
-1反码:11111111 11111111 11111111 11111110
+1
-1补码:11111111 11111111 11111111 11111111
2. 位移操作
>> 右移
把整数m的二进制向右移n位,m为正数,高位补0,m为负数,高位补1
3>>2:
3:00000000 00000000 00000000 00000011
移动2位置
(高位)00000000 00000000 00000000 00000000(低位)
3>>2=0
-3>>2
-3:11111111 11111111 11111111 11111101
移动2位置
11111111 11111111 11111111 1111111
3>>2=0
<< 左移
向左移动,正数 ,地位补0,负数,低位补1
3<<2
移动2位置
00000000 00000000 00000000 00001100
3<<2=12
>>> 无符号位移
不管符号,高位都补0
3>>>2=0
-3>>>2
-3 :11111111 11111111 11111111 11111101
移动2
00111111 11111111 11111111 11111111
-3>>>2=1073741823
> 注意:没有 <<<
> 位操作,速度快(底层就是二进制的机器操作指令)
> a*2
> 1 jvm 先为变量a分配空间
> 2 再进行*操作
> 3 才返回结果
> a<<1 只需一条指令
----------------------------------
~ 按位非
对整数的二进制 逐位取反
4:00000000 00000000 00000000 00000100
~4 逐位取反
11111111 11111111 11111111 11111011
=-5
| 按位或
对两个整数的二进制 进行1|0=1,0|1=1,1|1=1,0|0=0;(有1就为1)
4|-5
4: 00000000 00000000 00000000 00000100
-5 11111111 11111111 11111111 11111011
= 11111111 11111111 11111111 11111111=-1
& 按位与
对两个整数的二进制 进行1|0=0,0|1=0,0|0=0,1|1=1;(有0就为0)
4&-5
4: 00000000 00000000 00000000 00000100
-5 11111111 11111111 11111111 11111011
= 00000000 00000000 00000000 00000000=0
^ 按位异或
对两个整数的二进制 进行1^1=0,1^0=1,0^=1,0^0=0;(同为0,异为1)
4^-5
4: 00000000 00000000 00000000 00000100
-5 11111111 11111111 11111111 11111011
= 11111111 11111111 11111111 11111111=-1