本帖最后由 wander 于 2024-9-4 21:21 编辑  
 
所谓位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。 
 
C语言提供了六种位运算符: 
| 运算符 | & | | | ^ | ~ | << | >> |  | 说明 | 按位与 | 按位或 | 按位异或 | 取反 | 左移 | 右移 |  
  
 
按位或运算(|) 
 
参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。 
 
例如,9 | 5可以转换成如下的运算:    0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储) 
|   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储) 
----------------------------------------------------------------------------------- 
    0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101  (13 在内存中的存储) 9 | 5的结果为 13。 
 
又如,-9 | 5可以转换成如下的运算:    1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储) 
|   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储) 
----------------------------------------------------------------------------------- 
    1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储) -9 | 5的结果是 -9。 
 
按位或运算可以用来将某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以进行n | 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。 
 
【实例】对上面的分析进行校验。纯文本复制 
- #include <stdio.h>
 - int main(){
 -     int n = 0X2D;
 -     printf("%d, %d, %X\n", 9 | 5, -9 | 5, n | 0XFFFF0000);
 -     return 0;
 - }
 
 
  
 
运行结果: 
13, -9, FFFF002D 
 
 |