位运算符
位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。C 语言中的位运算符及其用法如表1所示。
表1 位运算符及其用法
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
& | 与 | 0 & 0 | 0 |
0 & 1 | 0 | ||
1 & 1 | 1 | ||
1 & 0 | 0 | ||
| | 或 | 0 | 0 | 0 |
0 | 1 | 1 | ||
1 | 1 | 1 | ||
1 | 0 | 1 | ||
~ | 取反 | ~0 | 1 |
~1 | 0 | ||
^ | 异或 | 0 ^ 0 | 0 |
0 ^ 1 | 1 | ||
1 ^ 1 | 0 | ||
1 ^ 0 | 1 | ||
<< | 左移 | 00000010<<2 | 00001000 |
10010011<<2 | 01001100 | ||
>> | 右移 | 01100010>>2 | 00011000 |
11100010>>2 | 11111000 |
接下来通过一些具体示例,对表3-6中描述的位运算符进行详细介绍,为了方便描述,下面的运算都是针对byte类型的数,也就是1个字节大小的数。
(1)与运算符“&”是将参与运算的两个二进制数进行“与”运算,如果两个二进制位都为1,则该位的运算结果为1,否则为0。
例如,将6和11进行与运算,6对应的二进制数为00000110,11对应的二进制数为00001011,具体演算过程如下所示:
00000110
&
00001011
———————
00000010
运算结果为00000010,对应数值2。
(2)位运算符“|”是将参与运算的两个二进制数进行“或”运算,如果二进制位上有一个值为1,则该位的运行结果为1,否则为0。
例如,将6与11进行或运算,具体演算过程如下:
00000110
|
00001011
———————
00001111
运算结果为00001111,对应数值15。
(3)位运算符“~”只针对一个操作数进行操作,如果二进制位是0,则取反值为1;如果是1,则取反值为0。
例如,将6进行取反运算,具体演算过程如下:
~ 00000110
—————————
11111001
运算结果为11111001,对应数值-7。
(4)位运算符“^”是将参与运算的两个二进制数进行“异或”运算,如果二进制位相同,则值为0,否则为1。
例如,将6与11进行异或运算,具体演算过程如下:
00000110
^
00001011
———————
00001101
运算结果为00001101,对应数值13。
(5)位运算符“<<”就是将操作数所有二进制位向左移动。运算时,右边的空位补0,左边移走的部分舍去。
例如,一个byte类型的数字11用二进制表示为00001011,将它左移一位,具体演算过程如下:
00001011 <<1
———————
00010110
运算结果为00010110,对应数值22。
(6)位运算符“>>”就是将操作数所有二进制位向右移动。运算时,左边的空位根据原数的符号位补0或者1(原来是负数就补1,是正数就补0)。
例如,一个byte的数字11用二进制表示为00001011,将它右移一位,具体演算过程如下:
00001011 >>1
———————
00000101
运算结果为00000101,对应数值5。