Java 位运算

  1. 1. 概述
  2. 2. 移位(左移和右移)
    1. 2.1. code
    2. 2.2. 执行逻辑
  3. 3. 无符号右移
    1. 3.1. code
    2. 3.2. 执行逻辑
      1. 3.2.1. 5>>>2
      2. 3.2.2. -5>>2
      3. 3.2.3. -5>>>2
  4. 4. 位与 &
    1. 4.1. code
    2. 4.2. 执行逻辑
  5. 5. 位或 |
    1. 5.1. code
    2. 5.2. 执行逻辑
  6. 6. 位异或
    1. 6.1. code
    2. 6.2. 执行逻辑
  7. 7. 位非 ~ (一元操作符)
    1. 7.1. code
    2. 7.2. 执行逻辑

概述

  • 左移 <<
  • 右移 >>
  • 无符号右移 >>>
  • 位与 &
  • 位或 |
  • 位非 ~
  • 位异或 ^

~ 为一元操作符外,其他的都是二元操作符。

移位(左移和右移)

code

1
2
3
4
public static void main(String[] args) {
System.out.println(5 << 2); //result 20
System.out.println(5 >> 2); //result 1
}

执行逻辑

  1. 将 5 转换为二进制(java int 类型为32位):00000000000000000000000000000101
  2. 左移的逻辑为将二进制结果左移两位,低位补 0:00000000000000000000000000010100,右移则将二进制结果右移两位,高位补0,其结果为:00000000000000000000000000000001
  3. 将二进制结果转换为十进制

无符号右移

code

1
2
3
4
5
public static void main(String[] args) {
System.out.println(5 >>> 2); //result 1
System.out.println(-5 >> 2); //result -2
System.out.println(-5 >>> 2); //result 1073741822
}

执行逻辑

5>>>2

  1. 5 转为二进制:00000000 00000000 00000000 00000101
  2. 右移 2 位得到:00000000 00000000 00000000 00000001(高位补0)
  3. 二进制转换为十进制结果为 1

-5>>2

  1. 得出 -5 的补码:11111111 11111111 11111111 11111011
  2. 右移 2 位得到:11111111 11111111 11111111 11111110(高位补1)
  3. 将 11111111 11111111 11111111 11111110 转换为原码:10000000 00000000 00000000 00000010
  4. 二进制原码转换为十进制:-2

-5>>>2

  1. 得出 -5 的补码:11111111 11111111 11111111 11111011
  2. 右移 2 位得到:00111111 11111111 11111111 11111110(高位补0)
  3. 当做原码转为十进制:1073741822

位与 &

code

1
2
3
public static void main(String[] args){
System.out.println(5 & 3); //result 1
}

执行逻辑

1
2
3
4
5 = 00000000 00000000 00000000 00000101(2)
3 = 00000000 00000000 00000000 00000011(2)
------------------------------------------
1 = 00000000 00000000 00000000 00000001(2)

第一个操作数的的第n位与第二个操作数的第n位如果都是1,那么结果的第n位也为1,否则为0

位或 |

code

1
2
3
public static void main(String[] args){
System.out.println(5 | 3); //result 7
}

执行逻辑

第一个操作数的的第n位与第二个操作数的第n位如果有一个是1,那么结果的第n位也为1,否则为0

位异或

code

1
2
3
public static void main(String[] args){
System.out.println(5 ^ 3); //result 6
}

执行逻辑

第一个操作数的的第n位与第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0

位非 ~ (一元操作符)

code

1
2
3
public static void main(String[] args){
System.out.println(~7); //result -6
}

执行逻辑

操作数的第n位为1,那么结果的第n位为0,反之。


二进制原码、反码、补码间转换参考:计算机中的二进制