按位运算符
| 运算符 | 示例 | 和示例相同 |
|---|---|---|
| &= | x &= 3 | x = x & 3 |
| |= | x |= 3 | x = x | 3 |
| ^= | x ^= 3 | x = x ^ 3 |
| >>= | x >>= 3 | x = x >> 3 |
| <<= | x <<= 3 | x = x << 3 |
& 按位与运算符
其作用是对两个整数的每一位进行与操作,即逐位比较两个数字的二进制表示,并根据以下规则进行计算:
- 如果两个对应位都是
1,结果是1; - 如果两个对应位中至少有一个是
0,结果是0。
例子:
假设我们有两个整数 a = 12 和 b = 10,我们希望对它们进行按位与操作。
- 12 的二进制表示:
- 12 的二进制是
1100(这是 4 位二进制表示,实际上 Java 中是 32 位,但为了简单展示只看低 4 位)。
- 12 的二进制是
- 10 的二进制表示:
- 10 的二进制是
1010。
- 10 的二进制是
- 按位与操作:
- 比较
12和10的二进制表示:
- 比较
1 | 1100 (12) |
代码示例:
1 | public class Main { |
解释:在这个例子中,a & b 的结果是 8,因为 12(1100)与 10(1010)按位与后得到 1000,即 8。
| 按位或运算符
作用:用于对两个数字的每一位进行“或”运算,逐位比较两个数字的二进制表示,并根据以下规则得出结果:
- 如果两个对应位中有至少一个是
1,结果是1; - 如果两个对应位都是
0,结果是0。
举个例子:
假设我们有两个整数 a = 12 和 b = 5,我们希望对它们进行按位或操作。
- 12 的二进制表示:
- 12 的二进制是
1100。
- 12 的二进制是
- 5 的二进制表示:
- 5 的二进制是
0101。
- 5 的二进制是
- 按位或操作:
- 比较
12和5的二进制表示:
- 比较
1 | 1100 (12) |
代码示例:
1 | public class Main { |
解释:
在这个例子中,a | b 的结果是 13,因为 12(1100)与 5(0101)按位或后得到 1101,即 13。
^ 按位异或运算符
它用于对两个数字的每一位进行“异或”运算
异或运算的规则:
- 如果两个对应的位相同(即都为 0 或都为 1),则结果为
0; - 如果两个对应的位不同(一个为 0,一个为 1),则结果为
1。
简而言之,不同为 1,相同为 0”的运算。
举个例子:
假设我们有两个整数 a = 12 和 b = 5,我们希望对它们进行按位异或操作。
- 12 的二进制表示:
- 12 的二进制是
1100。
- 12 的二进制是
- 5 的二进制表示:
- 5 的二进制是
0101。
- 5 的二进制是
- 按位异或操作:
- 比较
12和5的二进制表示:
- 比较
1 | 1100 (12) |
结果是 1001,即十进制的 9
代码示例:
1 | public class Main { |
解释:在这个例子中,a ^ b 的结果是 9,因为 12(1100)与 5(0101)按位异或后得到 1001,即十进制的 9。
常见的异或运算应用:
交换两个数: 异或可以用于在不使用临时变量的情况下交换两个数。通过三次异或操作,可以将两个数的值互换。
例如:
1 | int a = 10, b = 20; |
检测两个数是否相等: 如果 a ^ b == 0,则 a 和 b 是相等的。因为如果两数相同,它们的按位异或结果就是 0。
1 | java |
总结:
^是按位异或运算符,用于对两个整数的每一位执行异或操作。- 异或操作的规则是:相同为
0,不同为1。 - 异或运算有很多应用,特别是在交换变量、加密、校验等领域。
>> 右移运算符,用于将一个整数的二进制位向右移动指定的位数。(注意左补充)
在二进制表示中,右移操作意味着将数字的所有位移到更低的位置(即向右),并且最左边的空位根据数值的符号(符号位)填充。
右移运算符的基本规则:
- **
a >> n**:表示将整数a的二进制位向右移动n位。 - 对于正数,右移时会在左边补充
0。 - 对于负数,右移时会在左边补充
1,这称为 算术右移(保留符号位)。
举个例子:
假设我们有一个整数 a = 8,并执行 a >> 2:
- 8 的二进制表示:
- 8 的二进制是
1000。
- 8 的二进制是
- 执行右移操作:
8 >> 2表示将 8 向右移动 2 位:
1 | 1000 (8) -> 0010 (2) |
结果是 2
代码示例:
1 | public class Main { |
负数的右移:
对于负数,右移时会在左边填充符号位(即填充 1)。这被称为 算术右移。
假设 a = -8,并执行 a >> 2:
- -8 的二进制表示:
- 假设我们使用 8 位二进制表示,
-8的二进制是补码表示,即11111000。
- 假设我们使用 8 位二进制表示,
- 执行右移操作:
-8 >> 2表示将-8向右移动 2 位:
1 | 11111000 (-8) -> 11111110 (-2) |
结果是 -2
总结:
>>是右移运算符,将数字的二进制位向右移动。- 对于正数,左边补充
0;对于负数,左边补充1(算术右移)。 - 右移操作常用于高效地进行除法操作和位操作,特别是在性能要求较高的程序中。
在 Java 中,<< 是 按位左移运算符,用于将一个整数的二进制位向左移动指定的位数。
左移操作相当于将数值乘以 2 的某个幂。具体来说,a << n 表示将 a 的二进制位向左移动 n 位,并在右侧补充 0。
操作规则:
- 左移操作:
a << n将a的二进制表示向左移动n位,右侧补充0,并将高位丢弃。相当于将a乘以2^n(即a * 2^n)。 - 符号扩展:对于负数,Java 会保持符号位(即最高位)的完整性,左移时符号位不会受到影响。
例子:
1 | public class Main { |
解释:
a = 5的二进制表示是0000 0101(假设是 8 位表示)。a << 2表示将a的二进制表示左移 2 位,即:
1 | 0000 0101 -> 0001 0100 |
结果是 20,因为 5 * 2^2 = 5 * 4 = 20。 ( 0001 0100 它的10进制为 20 )
更深入的解释:
- 二进制左移:每次左移 1 位,相当于乘以 2。例如:
5 << 1:将5的二进制表示00000101左移 1 位,结果为00001010,即10。5 << 2:将5左移 2 位,结果为20。
- 溢出问题:如果左移时,超出了变量能够表示的位数,结果会变得不确定或出现溢出。例如,Java 中的
int是 32 位的,如果左移超出 31 位,可能会得到不可预料的结果。 - 符号扩展:如果是负数,Java 会保持符号位(最高位),即负数的符号位不会因为左移而改变。这意味着左移负数时,它的符号不变,但大小会增加。
注意:
- 在 Java 中,
<<仅适用于整数类型 (int,long)。 - 对于负数的左移,结果仍然会有符号扩展。
总结:
<<是按位左移运算符,它将一个数的二进制位向左移动指定的位数,并在右侧补0。- 左移操作相当于将数值乘以
2的某个幂,a << n等同于 `a * 2^n