int a[];
a &= ~(1<<n); 变量a[n]设置为0,其他bit不变
a |= (1<<n); 变量a[n]设置为1,其他bit不变
将a[x2到x1]=0000 假如x1到x2共4个(包含x1)bit为置0,1111 == 0xf
a &= ~(0xf << x1);
将a[x2到x1]=1111 假如x1到x2共4个(包含x1)bit为置1,1111 == 0xf
a |= (0xf <<x1);
位操作四件套
单个位的四个常用动作速查(reg 为目标变量/寄存器,n 为位号):
if (reg & (1 << n)) // 测试第 n 位是不是 1
reg |= (1 << n); // 把第 n 位置 1
reg &= ~(1 << n); // 把第 n 位清 0
reg ^= (1 << n); // 翻转第 n 位其中"测试"和"翻转"是上文没覆盖的两个动作:& 掩码不修改原值,适合直接放进 if 条件判断某一位;^ 对同一位异或两次等于翻回来,所以天然适合做"翻转"。