一、变换计算
1. 位与操作
位与即对两个操作数的每个位执行逻辑与操作,只有在对应的位都是 1
时,结果才为 1
。
对应 Java
操作示例如下,通过 &
执行位与操作。
public void demo1() {
int a = 9; // 二进制表示为 1001
int b = 5; // 二进制表示为 0101
int resultAnd = a & b; // 结果为 0001,即 1
System.out.printf("Bitwise AND: %s, \tBit: %s\n", resultAnd, Integer.toBinaryString(resultAnd));
}
2. 位或操作
位或即对两个操作数的每个位执行逻辑或操作,只要对应的位有一个为 1
,结果就为 1
。
对应 Java
操作示例如下,通过 |
执行位或操作。
public void demo2() {
int a = 9; // 二进制表示为 1001
int b = 5; // 二进制表示为 0101
int resultOr = a | b; // 结果为 1101,即 13
System.out.printf("Bitwise OR: %s, \tBit: %s\n", resultOr, Integer.toBinaryString(resultOr));
}
3. 异或操作
亦或即比对相同位置的数,两个数相同时为 0
,不同时为 1
。
对应 Java
操作示例如下,通过 ^
执行亦或操作。
public void demo3() {
int a = 9; // 二进制表示为 1001
int b = 5; // 二进制表示为 0101
int resultXor = a ^ b; // 结果为 1100,即 12
System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}
4. 位非操作
位非即对操作数的每个位执行取反操作,0
变 1
,1
变 0
。
二、位移计算
1. 正数位移
(1) 左移
通过符号 <<
表示左移,正数左移在末尾补 0
。
public void demo1() {
int a1 = 10;
// 10, 1010
System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));
int a2 = a1 << 2;
// 40, 101000
System.out.printf("%s, %s\n", a3, Integer.toBinaryString(a2));
}
(2) 右移
通过符号 >>
表示右移,正数右移最高位补符号位 0
。
public void demo2() {
int a1 = 10;
// 10, 1010
System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));
int a3 = a1 >> 2;
// 2, 10
System.out.printf("%s, %s\n", a3, Integer.toBinaryString(a3));
}
2. 负数位移
开始前先看一下如何计算负数的二进制,其步骤如下:
- 计算其对应绝对值的二进制值;
- 对得到的值执行取反操作,即每一位都取其相反值;
- 对得到的反码值加一得到补码,该补码即负数其对应的二进制;
注意计算补码加一时,若对应位计算结果大于 1
则对应计算结果为 0
并向前一位加 1
。
(1) 左移
通过符号 <<
表示左移,负数左移在末尾补 0
。
public void demo1() {
int a = 9; // 二进制表示为 1001
int b = 5; // 二进制表示为 0101
int resultXor = a ^ b; // 结果为 1100,即 12
System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}
(2) 右移
通过符号 >>
表示右移,负数右移最高位补符号位 1
。
public void demo2() {
int a = 9; // 二进制表示为 1001
int b = 5; // 二进制表示为 0101
int resultXor = a ^ b; // 结果为 1100,即 12
System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}
3. 无符号位移
对于无符号右移 >>>
,无论是正数还是负数, 右移最高位一律补 0
。
public void demo1() {
int a1 = 10;
// 10, 1010
System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));
int a4 = a1 >>> 2;
// 2, 10
System.out.printf("%s, %s\n", a4, Integer.toBinaryString(a4));
}