①对于正数而言,原码、反码、补码是相同的
②对于负数,原码,反码(为首位表示正负的1不变,剩下的0和1互换),补码(为反码加1)
左移<<
左移的快速计算方式就是乘以2的n次方,比如说左移两位就是乘以2的2次方。
就拿2来举例:
0000 0010 左移两位变成0000 1000变成了2乘以2的2次方,结果为8
对于负数左移也是一样的快速计算方式,比如-2左移两位变成-2*(2^2)=-8
右移>>
与左移相反,右移的快速计算方式就是除以2的n次方,如果除不尽就向下取整。
比如-9右移两位 等于-9/(2^2)=-3【向下取整为-3】
-9的原码为:1000 0000 0000 0000 0000 0000 0000 1001
反码为:1111 1111 1111 1111 1111 1111 1111 0110
补码为:1111 1111 1111 1111 1111 1111 1111 0111
右移两位为:11(补1) 1111 1111 1111 1111 1111 1111 1111 01
根据补码算反码:
11(补1) 1111 1111 1111 1111 1111 1111 1111 00
根据反码算原码:为-3
1000 0000 0000 0000 0000 0000 0000 0011
无符号右移>>>
运算规则:往右移动后,左边空出来的位置直接补0,不管最高位是0还是空出来的都拿0补。
正数:和右移一样
9>>>2 为2
负数:右移出去几位,左边补几个0,结果变成正数。
-9>>>2 为1073741821
例子:8>>>32 相当于没有移动还是8
8>>>34相当于移动两位
按位与:&
1&1 为1
1&0 为0
0&1 为0
0&0 为0
5&3 为1 5(0101)&3(0011) 为0001
按位或: |
运算规则:对应为只要有1即为1,相当于符号前后只要有一个为true,结果就是true
1 | 1 为1
1 | 0 为1
0 | 1 为1
0 | 0 为0
5 | 3 为7
按位异或:^
运算规则:对应位一样的为0,不一样的为1
1^1 为0
1^0 为1
0^1 为1
0^0 为0
5^3 为6
按位取反~
运算规则:~0就是1 ~1就是0
~10 结果为-11 符号位位0,取反后就为1 ,所以符号就变成了负号
10的补码(由于10是正数,原码,补码,反码一样):0000 0000 0000 0000 0000 0000 0000 1010
按位取反:1111 1111 1111 1111 1111 1111 1111 0101 换成反码
1111 1111 1111 1111 1111 1111 1111 0100 换成原码
1000 0000 0000 0000 0000 0000 0000 0100