Java位运算2_位运算

位逻辑运算符

与运算(&)

与运算:两个运算数比较位都是 1,则结果为 1,否则为 0。例如:5 & 3 = 1

0000 0000 0000 0000 0000 0000 0000 0101     5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011     3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0001     换算成 10 进制为 1

或运算(|)

或运算:两个运算数比较位有一个为 1,则结果为 1,否则为 0。例如:5 | 3 = 7

0000 0000 0000 0000 0000 0000 0000 0101     5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011     3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0111     换算成 10 进制为 7

异或运算(^)

异或运算:两个运算数比较位不同时,其结果是 1,否则为 0。例如:5 ^ 3 = 6

0000 0000 0000 0000 0000 0000 0000 0101     5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011     3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0110     换算成 10 进制为 6

非运算(~)

非运算:也叫做补,一元运算符,对其运算数的每一位取反。例如:~5 = -6

0000 0000 0000 0000 0000 0000 0000 0101     5 转换为二进制
1111 1111 1111 1111 1111 1111 1111 1010     取非后的原码
1000 0000 0000 0000 0000 0000 0000 0110     转换补码,换算成 10 进制为 -6

####其它

  • Java 中整数类型(byte、short、int 和 long)在内存中是以有符号的二进制补码表示。所以位运算时,首先要转换为原码。

  • 补码转原码:补码转原码和原码转补码的方法是一样的,取反 + 1(补码的补码是原码)。

  • 当位运算数是 byte 和 short 类型时,将自动把这些类型扩大为 int 型(32 位)。

  • 计算出 n 位二进制数所能表示的最大十进制数位移算法:-1L ^ (-1L « n) 或 ~(-1L « n)。

  • byte 和 int 相互转换

int i = 234;

byte b = (byte) i; // 结果:b = -22
// 转换过程:
// 0000 0000 0000 0000 0000 0000 1110 1010      # int 234 的补码(与原码相等)
//                               1110 1010      # byte 低位截取
//                               1001 0110      # 求得补码,转为 10 进制为 -22

int x = b ; // 结果为:x = -22;8 位 byte 的转 32 的 int,值不变。
int y = b & 0xff; // 结果为:x = 234; 可以通过将其和 0xff 进行位与(&)得到它的无符值
// 转换过程:
// 1001 0110                                    # byte -22 的原码
// 1000 0000 0000 0000 0000 0000 0001 0110      # int -22 的原码
// 1111 1111 1111 1111 1111 1111 1110 1010      # int -22 补码
// 0000 0000 0000 0000 0000 0000 1111 1111      # 0xff 的二进制数
// 0000 0000 0000 0000 0000 0000 1110 1010      # 和 0xff 进与操作的结果,转换为 10 进制为 234