1.位运算
位指的是二进制位,也就是比特位。
计算机中所有的运算在底层中都是二进制的运算。位运算可以提高程序的效率。而且以后我们在研究底层源码的时候会发现很多地方都用到了位运算,所以,有必要简单了解一下位运算。
2. 位运算的种类
在进行位运算的时候,必须要把数据全部转换成二进制位,并且全部都是二进制的补码形式。
连接符 | 操作 | 规则 | 运算类型 |
---|---|---|---|
& | 按位与 | 两个都是1的时候才是1 | 双目运算 |
| | 按位或 | 有1个为1即为1 | 双目运算 |
^ | 按位异或 | 两个不一样为1,一样为0 | 双目运算 |
~ | 按位取反 | 1变0,0变1 | 单目运算 |
<< | 左移 | ||
>> | 右移 | ||
>>> | 无符号右移 |
2.1 | 运算
System.out.println(~3);
int a = 0b00000000000000000000000000000011;//3的补码也是原码
// 运算之后的结果
int b = 0b11111111111111111111111111111100;//最高位为1=负数,补码(因为a是补码,进行~运算之后还是补码)
// 补码 = 原码取反 + 1
// 补码 - 1
int c = 0b11111111111111111111111111111011;
// 原码
int d = 0b10000000000000000000000000000100;
System.out.println(b);
System.out.println(c);
System.out.println(d);
//运算结果
//-4
//-4
//-5
//-2147483644
2.2 ^(异或)的常见应用
- 一个数据对相同的数据异或两次,结果不变,一般应用在加密上.
- 实现两个变量值的交换。
通常在两个变量之间进行数据交换需要用到第三个数据载体。例如a=10; b=20;c;
c =a; a = b; b = c;
通过==^==来实现:
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);//20
System.out.println(b);//10
2.3 位移运算符
- 左移:让操作数乘以2的n(位移的位数)次幂。
- 右移:让操作数除以2的n次幂。
- 无符号右移:让操作数除以2的n次幂。
左移
往左边移动位数,右边会出现空位! 左边移动的两位就被挤掉了,右边空出来的用0补齐。
右移
往右边移动位数,左边会出现空位! 右边移动的两位就被挤掉了,左边空出来的用符号位补齐。
无符号右移
与右移区别:左边空出的位置不看符号位,全部用0补全。
结论: 正数的右移和无符号右移的结果是一样的。负数无符号右移之后变为一个正数。