Java中位逻辑运算符与位移运算符(从原理进行解释)
逻辑运算符:https://moonshuo.cn/posts/59455.html
位运算符
计算机在运行和存储过程中都是以补码的方式进行的(非常重要!!!),与运算,或运算等都是以补码进行位运算。
运算符 | 含义 | 举例 | 解释 | 结果 |
---|---|---|---|---|
& | 位与运算符 | 4&5 | 0000 0100(4的补码,不是源码)&0000 0101(5的补码),对应的位进行与逻辑运算 | 0000 0100(4的补码,其结果与源码相同)–>4 |
| | 位或运算符 | -4|5 | -4补码:11111111 11111111 11111111 11111100 5补码:00000000 00000000 00000000 00000101 | 11111111 11111111 11111111 11111101(此为结果的补码,转换成相应的源码)—>1…….00000011=-3 |
^ | 位异或逻辑 | 4^5 | 0000 0100^0000 0101,对应位置进行异或逻辑运算 | 0000 0001(此为结果的补码)——>源码表示为1 |
~ | ~4 | 看下面 | -5 |
解释:
- 4表示为00000000 00000000 00000000 00000100,第一位为符号位,0表示正数,1表示负数。
- 4的补码=4的源码,为00000000 00000000 00000000 00000100。
- ~4操作,得到的是结果的补码:11111111 11111111 11111111 11111011
- 源码为:10000000 00000000 00000000 00000101—->-5
我们再来推导以下~(-2)做练习
- 先得到-2源码:10000000 00000000 00000000 00000010
- -2得反码:11111111 11111111 11111111 11111101
- -2得补码:11111111 11111111 11111111 11111110
- ~(-2)操作(得到的是结果的补码):00000000 00000000 00000000 00000001
- 结果的源码为:00000000 00000000 00000000 00000001—>1
1 | public class Test { |
位移运算符
这里位运算也都是按照补码进行位运算
运算符 | 作用 | 举例 | 解释 | 结果 |
---|---|---|---|---|
>> | 右移位运算,负数补充1,正数补充0 | 8>>1 | 8右移1位(1000)——0100 | 4 |
-8>>4 | -8右移四位 | -1 | ||
<< | 左移位运算 | 9<<2 | 9左移两位(0000 1001)——0010 0100 | 36 |
>>> | 逻辑右移,也叫无符号右移,高位补充0 | -8>>>2 |
这里举一个简单的例子:
- -8的源码为:10000000 00000000 00000000 00001000
- -8反码为:11111111 11111111 11111111 11110111,其补码为11111111 11111111 11111111 11111000
- 位移二位,高位补0,得到结果的补码:00111111 11111111 11111111 11111110
- 则结果的反码为:11000000 00000000 00000000 00000001,源码为001111111 11111111 11111111 11111110=1073741822
1 | public class Test { |