按位运算符
运算符 | 示例 | 和示例相同 |
---|---|---|
&= | 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