Java中的二进制位运算分为:
- 按位取反
- 按位与
- 按位或
- 按位异或
- 左移
- 右移
一:按位取反 ~
顾名思义,就是将二进制位的每一位取反
例: 000101100 ~000101100 =111010011
但是在上机运行的时候,System.out.println(~5) 输出位-6
我们来分析分析:
Java使用补码来表示二进制,在补码表示中,最高为为0表示正数,而最高位为1表示负数。
1.对正数而言,最高位为0,其余各位表示数值本身,如+42=00101010
2.对负数而言,把该数的绝对值的补码,取反之后加一,即得到该负数的补码。如-1 -1的绝对值的补码为0000 0001 补码取反后为: 11111110 加1:11111111 所以-1的补码为111111112
5的二进制原码为0000 0101 ,取反后为11111010 ,取反后的值是我们存储在电脑中的值,但是如果我们要将它输出来,就要以十进制的形式显示,那11111010在电脑中是补码,补码直接到十进制不容易看出来,所以我们按照上面的方法推出原码, 该补码的最高位为1,所以是负数,
负数的补码=~|负数|+1
|负数|= ~(补码-1)
11111010-1=11111001
取反之后:00000110
该二进制对应的十进制为6 所以输出的是-6,
二:按位与 &
1.两个操作数中,如果两个相应位为1,则该位的结果为1,否则为0
例如:01011010 & 00101111=00001010
2.按位与的运用:
(1)对特定位进行清0,(可以是某特定一位,也可以是某几位)
i&8 就是右边四位不变,而其他位数被清0
(2)取某个数中的指定位
i&16 取出变量中的第5位