贡献者: addis
bits & mask 可以把 mask 为 0 的地方清零,其余不变。
bits | mask 可以把 mask 为 1 的地方开启,其余不变。
bits ^ mask 可以把 mask 为 1 的地方翻转,其余不变(异或算符 XOR,相反时为 1,否则为零)。
~(bits1 ^ bits2) 可以实现 NXOR 同或(没有专门的同或算符)。
bits 的一些地方设为指定 pattern,就先用 & 把该部分清零再用 | 设置 pattern。
<< 和 >> 的右边不可以是负数,结果 undefined。
>> 是 implementation defined 的(大部分会在左边加 1),所以要用 unsigned 类型。
n << m 或者 n >> m 中如果 m >= 8*max(sizeof(int), sizeof(n)),结果是未定义的,有一些编译器会得到 n << (m % sizeof(n))。如果直接用超出范围的常数,编译器可能会警告。另外注意如果 sizeof(n) < sizeof(int),integral promotion 会把 n 先变为 int 类型。
n << 1 等效于乘 2,n >> 1 等效于除 2。
n 个 1 的 mask,就用 (1 << n) - 1。注意没有必要把他转换为比 int 更小的类型,因为在参与运算时仍然会根据 integral promotion 转成 int 或者 unsigned int(如果 int 不能表示整个范围)。
n 个 1 的 “单字节” mask,就用 255 << (8-n)
m bit 开始的 n 个 1 的 “单字节” mask,就用 ((1 << n) - 1) << (8-n-m)
<< 要先把 bytes 翻过来,shift 完以后再次翻回去。
0001, 0011, 0111, 1111 分别是 0x1, 0x3, 0x7, 0xF。不熟练的话也可以用 0b101010,但看起来比较业余。
char 可能是 signed 也可能不是。int16_t,uint16_t 保证有两个字节(short 不保证),int32_t,uint32_t 保证有四个字节(int 不保证)。