贡献者: 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
不保证)。