按位运算符对整数值的位进行操作。有六个按位运算符,如下表所示。
运算符 | 描述 |
---|---|
& | 按位AND运算符 |
Ι | 按位OR运算符 |
^ | 按位异或(XOR)运算符 |
~ | 按位NOT运算符,也称为1 的补码运算符 |
>> | 按位右移运算符 |
<< | 按位向左移位运算符 |
所有按位运算符仅适用于整数类型。~
运算符是一元运算符 - 它适用于一个操作数 - 其他运算符是二元运算符。
按位AND运算符&
,组合其操作数的相应位,使得如果两个位均为1
,则结果位为1
; 否则,结果位为0
。
假设声明以下变量:
int x = 13;
int y = 6;
int z = x & y; // x和y的与运算相应位
z
的值为4
(二进制100
)。 这是因为x
和y
中的相应位组合如下:
x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
y | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
x & y | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
如果相应位中的任何一个或两个都是1
,则按位OR
运算符|
,结果为1
; 否则,结果为0
。
如果使用|
组合相同的x
和y
值,运算符在如下的语句中:
int z = x | y; // OR the bits of x and y
结果如下:
x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
y | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
x Ι y | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
因此,存储在z
中的值将是15
(二进制表示为1111
)。
如果两个位都不同,则按位XOR运算符^
生成1
,如果它们相同则生成0
。
int z = x ^ y; // 异或x和y的位
这导致z
包含值11
(二进制值为1011
),因为这些位组合如下:
x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
y | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
x ^ y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
一元运算符~
翻转其操作数的位,因此1
变为0
,0
变为1
。
可以将此运算符应用于值为13
的x
变量:
int z = ~x; // 存储1的x补码
执行此语句后,z
将具有值14
。这些位设置如下:
x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
~x | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |