最近又看了下位运算符的内容,自己再次消化后,决定还是记录下来,万一以后再忘了直接看自己的,省的再满世界的去找了。。。
我自己了解到的按位运算符有6个,分别是:
- & 按位与
- | 按位或
- ^ 按位异或
- >> 右移
- << 左移
- >>> 无符号右移
- ~ 按位非
1、&(按位与):任何二进制位与0进行 & 计算,结果都是0;和1进行&计算,结果是原值。即:二进制位都是1时,进行 & 计算结果是1,其他情况计算结果都是0
如:6的二进制是:000110,5的二进制是:000101,6 & 5 = 000110 & 000101 = 000100 = 4
2、|(按位或):任何二进制位与0进行 | 计算,结果是原值;和1进行 | 计算,结果都是1。即:二进制位都是0时,进行 | 计算结果是0,其他情况计算结果都是1
如:6的二进制是:000110,5的二进制是:000101,6 | 5 = 000110 | 000101 = 000111 = 7
3、^(按位异或):任何相同的二进制位进行 ^ 计算,结果是0;不相同的二进制位进行 ^ 计算,结果是1。
如:6的二进制是:000110,5的二进制是:000101,6 ^ 5 = 000110 ^ 000101 = 000011 = 3
4、>>(右移):二进制从低位进行移除并将剩余的向右移动,原先最高位是1补1,是0补0,其它空位补0。右移n位,实现效果等同于除以2的n幂次方
如:8的二进制是:001000,8 ÷ 23 = 8 >> 3 = 001000 = 000001 = 1
5、<<(左移): 二进制从高位进行移除并将剩余的向左移动,原先最高位是1补1,是0补0,其它空位补0。左移n位,实现效果等同于乘以2的n幂次方
如:8的二进制是:001000,1 × 23 = 1 << 3 = 000001 = 001000 = 8
6、>>>(无符号右移):二进制从低位进行移除并向右移动,不管原先最高位是1还是0,和其它空位一样补0。对于正数,无符号右移等同于右移,但是如果还是负数进行无符号右移,会出现计算问题。因为二进制最高位是作为符号位来保存的,正数最高位为0,负数最高位为1,而且负数的二进制计算和正数的二进制计算是相反的(即-1的二进制位数值都是1),你品品,你细品。
如:int类型(32位)-1的二进制是:11111111111111111111111111111111,-1 >>> 1 = 11111111111111111111111111111111 = 01111111111111111111111111111111 = 231 - 1 = 2147483647,
int类型的(32位)-2的二进制是:11111111111111111111111111111110,-2 >>> 1 = 11111111111111111111111111111110 = 01111111111111111111111111111111 = 231 - 1 = 2147483647
int类型的(32位)-3的二进制是:11111111111111111111111111111101,-3 >>> 1 = 11111111111111111111111111111101 = 01111111111111111111111111111110 = 230 = 2147483646
7、~(按位非):二进制位进行非运算(~),位是1的结果为0,位是0的结果为1
如:int类型(32位)-1的二进制是:11111111111111111111111111111111,~-1 = ~(11111111111111111111111111111111) = 0000000000000000000000000000 = 0
int类型(32位)1的二进制是:00000000000000000000000000000001,~1 = ~(00000000000000000000000000000001) = 11111111111111111111111111111110= -2