2.1 操作最右边的位元
- 将字组中值为1且最靠右的位元‘关闭’(0101 1000 => 0101 0000)
x&(x-1)==0 ? x是2的幂或0 :x不是2的幂且不是0
- 将字组中值为0且最靠右的位元‘打开’(1010 0111=>1010 1111)
x|(x+1)
- 将字组尾部的1变成0,如果尾部没有1,则x不变(1010 0111 => 1010 0000)
x&(x+1) == 0 ? 无符号整型是2^n-1 或0 :无符号整型不是2^n-1 且不为0
- 将字组尾部的0都变成1,如果尾部没有0,则x不变(1010 1000=> 1010 1111)
x | (x-1)
- 把x中最靠右且值为0的位元变为1,并将其余位 置0,如果x中没有值为0的位元,则结果为0
(1010 0111 => 0000 1000)
(not x) & (x+1)