https://java-er.com/blog/java-shit-operation/
Java位运算符(bitwise operators),应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)。
位运算符作用在所有的位上,并且按位运算。假设a = 5,b = 12;它们的二进制格式表示将如下:
A = 0101 B = 1100 ----------------- A&B = 0100 A | B = 1101 A ^ B = 1001 ~A= 1010
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | a & b = 4 即100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | a | b = 13 即1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | a ^ b = 9 即1001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | ~a = -6 即1010 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | a << 2 = 20 即10100 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | a >> 2 = 1 即1 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | a >>> 2 = 1 即1 |
位移说明
A << 2 表示A 向左边移动2位 A = 0101 计算机的前面其实还有很多0 所以 表示如下 位移前:A = 0000 0101 位移后:A = 0001 0100 当A >> 2 向右边移动的时候,后面没有空间了。所以砍掉 位移前:A = 0000 0101 位移后:A = 0000 0001
Java测试代码
int a = 5; int b = 12; System.out.println("a 的二进制:" + Integer.toBinaryString(a)); System.out.println("b 的二进制:" + Integer.toBinaryString(b)); int c = 0; c = a & b; System.out.println("a & b = " + c +" 即"+Integer.toBinaryString(c)); c = a | b; System.out.println("a | b = " + c +" 即"+Integer.toBinaryString(c)); c = a ^ b; System.out.println("a ^ b = " + c +" 即"+Integer.toBinaryString(c)); c = ~a; System.out.println("~a = " + c +" 即"+Integer.toBinaryString(c)); c = a << 2; System.out.println("a << 2 = " + c +" 即"+Integer.toBinaryString(c)); c = a >> 2; System.out.println("a >> 2 = " + c+" 即"+Integer.toBinaryString(c) ); c = a >>> 2; System.out.println("a >>> 2 = " + c+" 即"+Integer.toBinaryString(c) );
输出
a 的二进制:101 b 的二进制:1100 a & b = 4 即100 a | b = 13 即1101 a ^ b = 9 即1001 ~a = -6 即11111111111111111111111111111010 a << 2 = 20 即10100 a >> 2 = 1 即1 a >>> 2 = 1 即1
复合位赋值运算符
运算符 | 含义 | 实例 | 结果 |
---|---|---|---|
&= | 按位与赋值 | a &= b | 等价于 a=a & b |
|= | 按位或赋值 | a |= b | 等价于 a=a | b |
^= | 按位异或赋值 | a ^= b | 等价于 a=a ^ b |
-= | 按位取反赋值 | a ~= b | 等价于 a=a ~ b |
«= | 按位左移赋值 | a «= b | 等价于 a=a « b |
»= | 按位右移赋值 | a »= b | 等价于 a=a » b |