直接上例题

eg:
给定一个整型变量 a ,写两段代码,第一个设置 a 的 bit 3,第二个清除 bit 3。在以上两个操作中,要保持其他位不变。

分析:
使用 #define 和 bit masks 操作。这是一个有极高可移植性的方法。

最佳解决方法:

#define BIT3(0x1 << 3)
static int a;

void set_bit3(void)
{
    a |= BIT3;
}
void clear_bit3(void)
{
    a &= ~BIT3;
}
  • 使用 #define 定义常量 bit 3 ==>1000
  • a |= BIT3;   ==>   a = a |= BIT3;        |(或):有 1 为 1 ,将 bit 3 置位
  • a &= ~BIT3;    ==>   a = a &= ~BIT3;         &(与):有 0 为 0 ,使用 ~ 取反后将 bit 3 清零

位操作注意事项:左右移带来符号位的变化

  1. 正数无论左移还是右移都是补 0
  2. 负数的补码左移在右边补 0 ,右移需要在左边补 1 
    eg:有符号位8位机器数(补码):1,110 0110 右移一位是:1,111 0011,开始的符号位变成了现在的数据位
  3. 有些乘法运算可以采用左右移来解决
    eg:unsigned short A;  计算 A*256 :乘上256就是左移 8 位,左移时在低位即右边补 0