-
位与运算符(&)
运算规则:两个数都转为二进制,然后从高位开始比较,高位不足补0,如果两个数都为1则为1,否则为0。
例子:6的二进制为110,1的十进制为1 , 6 & 1 = 0 110 001 ------- 000 => 转换成10进制得0; 10的二进制为1010, 6 & 10 = 2 0110 1010 --------- 0010 => 转换成10进制得2;
-
位或运算符(|)
运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
例子参考位与运算符(&) -
位异或运算(^)
运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
例子参考位与运算符(&) -
位非运算符(~)
运算规则:如果位为0,结果是1,如果位为1,结果是0.
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的 数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
比如:~37
37转为二进制是100101.
补码后为: 00000000 00000000 00000000 00100101
取反为: 11111111 11111111 11111111 11011010
因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。
因此,我们可将这个二进制数的补码进行还原: 首先,
末尾减1得反码:11111111 11111111 11111111 11011001 ,
其次,将各位取反得原码:00000000 00000000 00000000 00100110,
此时二进制转原码为38
所以~37 = -38.
-
原码
一个正数,转换为二进制位就是这个正数的原码。
负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 -
反码
正数的反码就是原码,
负数的反码等于原码除符号位以外所有的位取反 -
补码
正数的补码与原码相同,
负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.