一. 位运算符
C提供了几种位操作符,如下表所示:
运算符 | 含义 | 运算符 | 含义 |
& | 按位与 | ~ | 取反 |
| | 按位或 | << | 左移 |
^ | 按位异或 | >> | 右移 |
二. 位运算操作
1. "按位与" (&)
原则是:全1为1,有0为0。
2. “按位或” (|)
原则是:有1为1,全0为0。即只要有一个为1,则结果为1。
3. “异或” (^)
原则是:相同为0,不同为1。即参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’,不同时为‘1’。
4. “取反” (~)
原则是:是 1 得 0,是 0 得 1。
5. "左移"(<<)
用来将一个数的各位全部向左移若干位。
如:a = a<<2 表示将a的各位左移 2 位,右边补0。
左移 N 位,就等于乘以了2N,但一结论只适用于左移时被溢出的高位中不包含‘1’的情况。
6. "右移"(>>)
右移与左移相类似,只是位移的方向不同。
如:a = a>>1表示将a 的各位向右移动1位。
右移N位,就相当于除以2N,但要注意符号位的问题。
三. 应用
1. & 的应用
a. 特定位清零 (mask中特定位 置0,其它位为1,s = s & mask)
b. 取某数中指定位 (mask中特定位 置1,其它位为0,s = s & mask)
2. |的应用
a. 常用来将源操作数某些位 置1,其它位不变。 (mask中特定位 置1,其它位为0,s = s | mask)
3. ^ 的应用
a. 使特定位的值取反 (mask中特定位 置1,其它位为0,s = s ^ mask)
b. 不引入第三变量,交换两个变量的值 (a = a^b; b = a^b; a = a^b)