一:与运算(&): 可以看作二进制的 乘法运算
1 & 0 = 0
1 & 1 = 1
0 & 0 = 0
0 & 1 = 0
eg: 5 & 6 = 4
===》 5的2进制: 0000 0101
===》 6的2进制: 0000 0110
&运算===》 0000 0100 ===> 对应的 10 进制是:4
二:或运算(|): 0 或 1 中 只要有1 结果就是1
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
ps: 12 | 18 = 30
12 | 18 | 11 = 31 ==》 30 | 11 = 31
eg: 5 | 6 = 7
===》 5的2进制: 0000 0101
===》 6的2进制: 0000 0110
| 运算===》 0000 0111 ===> 对应的 10 进制是:7
三:按位取反运算(~): 针对于数字的二进制码,0 转换成 1,1转换成 0
~ 0 = 1
~ 1 = 0
eg: ~ 6 ==> 0000 0110 ==> 1111 1001 ==> 得出这个数字是负数, 然后获取到它的反码,再得到原码
对应反码(-1): 1111 1000
对应原码: 0000 0111
对应的10进制: 7
所以 ~6 对应 的是 -7
四:异或运算(^): 指两个数字展开成二进制后,分别对相应的位置上的数字进行运算,相同取0,相异取 1
eg : 5 ^ 6 = 3
===》 5的2进制: 0000 0101
===》 6的2进制: 0000 0110
运算===》 0000 0011 ===> 对应的 10 进制是:3
五:左移运算(<<): 原理是将二进制数,所有数字向左移动,高位超出范围自动舍弃,低位补0
以一个short 的范围举例(一个short 是由二个字节组成,也就是由16个二进制数表示):
比如数字: 9 << 5 = 288
9 的二进制表示 : 00000000 00001001
向左移动5位,高位超出部分丢弃,低们补0: 00000001 00100000
对应的10进制: 1*2^8 + 1*2^5 = 1*256 + 1*32 = 288
笔者自己发现 9 << 5 可以等价于 ==》 9* 2^5 = 9* 32 = 288
推出公式等价: a << b ==> a * 2 ^ b
六:右移运算(>>>): 原理是将二进制数,所有数字向右移动,高位补0,低位超出范围,则舍弃。
以一个short 的范围举例(一个short 是由二个字节组成,也就是由16个二进制数表示):
比如数字: 304 >> 5 = 9
9 的二进制表示 : 00000001 00110000
向右移动5位,高位超出部分丢弃,低们补0: 00000000 00001001
对应的10进制: 1*2^3+1=9
笔者自己发现 304 >> 5 = 9 可以等价于 ==》 304/(2^5) = 304/32 = 9
推出公式等价: a >> b ==> a/(2 ^ b)