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

解释:

  1. 4表示为00000000 00000000 00000000 00000100,第一位为符号位,0表示正数,1表示负数。
  2. 4的补码=4的源码,为00000000 00000000 00000000 00000100。
  3. ~4操作,得到的是结果的补码:11111111 11111111 11111111 11111011
  4. 源码为:10000000 00000000 00000000 00000101—->-5

我们再来推导以下~(-2)做练习

  1. 先得到-2源码:10000000 00000000 00000000 00000010
  2. -2得反码:11111111 11111111 11111111 11111101
  3. -2得补码:11111111 11111111 11111111 11111110
  4. ~(-2)操作(得到的是结果的补码):00000000 00000000 00000000 00000001
  5. 结果的源码为:00000000 00000000 00000000 00000001—>1
1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String [] args){
System.out.println(4&5);
System.out.println(-4|5);
System.out.println(4^5);
System.out.println(~4);
System.out.println(~-2);
}
}

image-20220704174936719位移运算符

这里位运算也都是按照补码进行位运算

运算符 作用 举例 解释 结果
>> 右移位运算,负数补充1,正数补充0 8>>1 8右移1位(1000)——0100 4
-8>>4 -8右移四位 -1
<< 左移位运算 9<<2 9左移两位(0000 1001)——0010 0100 36
>>> 逻辑右移,也叫无符号右移,高位补充0 -8>>>2

这里举一个简单的例子:

  1. -8的源码为:10000000 00000000 00000000 00001000
  2. -8反码为:11111111 11111111 11111111 11110111,其补码为11111111 11111111 11111111 11111000
  3. 位移二位,高位补0,得到结果的补码:00111111 11111111 11111111 11111110
  4. 则结果的反码为:11000000 00000000 00000000 00000001,源码为001111111 11111111 11111111 11111110=1073741822
1
2
3
4
5
6
7
public class Test {
public static void main(String [] args){
System.out.println(-8>>1);
System.out.println(9<<2);
System.out.println(-8>>>2);
}
}

image-20220704174945978