Java的位运算符:左移(<<)、右移(>>)、无符号右移(>>>)、与(&)、异或(|)、非(~)
除了 非(~) 是一元操作符外,其他都是二元操作符。

运算符 运算 说明
<< 左移 空位补0,被移除的高位丢失
>> 右移 被移位的二进制最高位是0,右移后,空缺位补0,最高位是1,最高位补1
>>> 无符号右移 被移位的二进制无论是0或者是1,空缺位都是用0补
& 与运算 任何二进制位和0进行&运算,结果都是0,和1进行&运算,都是原值
l 或运算 任何二进制位和0进行或运算,结果都是原值,和1进行或运算,都是1
^ 异或运算 任何相同二进制位进行异或运算,结果都是0,不同二进制位进行异或运算,结果都是1
~ 非运算 反转操作数的二进制位,即0变成1,1变成0
  1. 左移(<<)

    ​ 示例1: 将5左移2位

    1
    2
    3
    4
    5
    6
    7
    package io.github.code;

    public class Test {
    public static void main(String[] args) {
    System.out.println(5 << 2);//运行结果是20
    }
    }

    java中,整数默认就是int类型32位,首先将5转为二进制表示:

    1
    2
    3
    0000 0000 0000 0000 0000 0000 0000 0101      然后左移2位后,低位补0

    0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
  2. 右移(>>)

    ​ 示例2: 将5右移2位

    1
    System.out.println(5>>2);//运行结果是1

    还是先将5转为二进制表示:

    1
    2
    3
    0000 0000 0000 0000 0000 0000 0000 0101      然后右移2位,高位补0

    0000 0000 0000 0000 0000 0000 0000 0001 换算成10进制为1
  3. 无符号右移(>>>)

    ​ 示例3: 分别将5右移3位、将-5右移3位、将-5无符号右移3位

    1
    2
    3
    System.out.println(5>>3);//结果是0
    System.out.println(-5>>3);//结果是-1
    System.out.println(-5>>>3);//结果是536870911

    还是来看看位移过程:

    1
    2
    3
    4
    5
    6
    5换算成二进制: 0000 0000 0000 0000 0000 0000 0000 0101
    5右移3位后结果为0,0的二进制为: 0000 0000 0000 0000 0000 0000 0000 0000

    -5换算成二进制: 1111 1111 1111 1111 1111 1111 1111 1011
    -5右移3位后结果为-1,-1的二进制为: 1111 1111 1111 1111 1111 1111 1111 1111
    -5无符号右移3位后的结果 536870911 换算成二进制: 0001 1111 1111 1111 1111 1111 1111 1111

正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)

  1. 与(&)

    ​ 示例4: 5&3 进行与运算

    1
    System.out.println(5 & 3);//结果为1

    转换为二进制比较:

    1
    2
    3
    4
    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    1转换为二进制:0000 0000 0000 0000 0000 0000 0000 0001

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

  2. 或(|)

    ​ 示例5: 5|3 进行或运算

    1
    System.out.println(5 | 3);//结果为7

    转换为二进制比较:

    1
    2
    3
    4
    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    7转换为二进制:0000 0000 0000 0000 0000 0000 0000 0111

    或(|)第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0

  3. 异或(^)

    ​ 示例6: 5^3 进行异或运算

    1
    System.out.println(5 ^ 3);//结果为6

    转换为二进制比较:

    1
    2
    3
    4
    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110

    异或(^)第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0

  4. 非(~)

    ​ 示例7: ~5 进行非运算

    1
    System.out.println(~5);//结果为-6

    转换为二进制比较:

    1
    2
    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
    -6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010

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

位运算操作符衍生而来的有:

  • &= 按位与赋值

  • |= 按位或赋值

  • ^= 按位非赋值

  • >>= 右移赋值

  • = 无符号右移赋值

  • <<= 赋值左移

和 += 一个概念。

示例:

1
2
3
int a = 5
a &= 3; //此时等同于 a = a&3 即 a = 5&3;
System.out.println(a);//结果是1

Reference

Java 位运算