1."&"(按位与)
运算规则:两个二进制同一位上都是1,结果才是1,否则为0(十进制转为二进制进行运算)
比如: 20 & 2 = 0(十进制)
20的二进制为 0001 0100
2的二进制为 0000 0010
按位与结果为 0000 0000 = 0(十进制)
2."|"(按位或)
运算规则:两个二进制同一位上都是0,结果才是0,否则为1(十进制转为二进制进行运算)
比如: 20 | 2 =22(十进制)
20的二进制为 0001 0100
2的二进制为 0000 0010
按位或结果为 0001 0110 = 22(十进制)
3."<<"(左移运算符)
运算规则:向左移动X位,无论正负数低位(最右边)都补x个0(正数扩大2的x次方倍,负数缩小2的x次方倍)
比如: 20 << 2 = 80
20的二进制为 0001 0100
向左移动两位 0101 0000 = 80(十进制)
4.">>"(右移运算符)
运算规则:向右移动X位,正数高位(最左边)补x个0,负数高位(最左边)补x个1(正数缩小2的x次方倍,负数扩大2的x次方倍)
比如: 20 >> 2 = 5
20的二进制为 0001 0100
向右移动两位 0000 0101 = 5(十进制)
5."<<<"
无此表达式
6.">>>"(无符号右移运算符)
运算规则:无符号右移x位,无符号是与>>x对比的,该操作在移动后,无论正负数高位(最左边)都补0
比如: 20 >>>2=5
20的二进制为 0001 0100
向右移动两位 0000 0101 = 5(十进制)
负数的二进制数表示方法与正数不同,需要使用补码来表示。
补码是每个负数绝对值对应的二进制取反加一
-5是在java中默认是int类型,int 占4个字节,每个字节8位,即32位
-5的源码 1000 0000 0000 0000 0000 0000 0000 0101
比如: -5 的补码
-5的绝对值为5,对应的二进制 1000 0000 0000 0000 0000 0000 0000 0101
取反对应的二进制 1111 1111 1111 1111 1111 1111 1111 1010
加1 1
结果 (补码) 1111 1111 1111 1111 1111 1111 1111 1011 (-5的补码)
比如: -5 >>>2
-5的二进制补码为 1111 1111 1111 1111 1111 1111 1111 1011
向右移动两位 0011 1111 1111 1111 1111 1111 1111 1110(补码)正数源码反码补码相同
结果 2^30-2=1073741822
7."^"(异或)
运算规则:两个二进制位"同0异1",也就是相同为0,不同为1
比如: 20 ^ 6 = 18(十进制)
20的二进制为 0001 0100
6的二进制为 0000 0110
异或结果为 0001 0010 = 18(十进制)
8."~"(取反)
运算规则:正数的源码反码补码相同,所以正数的反码与源码相同,负数的反码是对应正数源码每位取反
比如: ~20 = 20
20的二进制为 0001 0100(源码)
正数的反码与源码相同
比如: ~(-20)
-20的二进制为 1001 0100(源码)
取反 1110 1011(-20的反码)