常见二进制奇技淫巧

判断奇偶数

1
2
3
if(0 == (a & 1)) {
//偶数
}

判断二进制某个位是否为1

把1左移N-1位,再进行and操作,如果大于0则代表该二进制位就为1

1
x&(1<<5)

减去低位的最后一个1|将最右边的1变成0

1
x = x&(x-1)

O(1) 时间检测整数 n 是否是 2 的幂次

1
x&(x-1) == 0 //是

高低位交换

给定一个 16 位的无符号整数,将其高 8 位与低 8 位进行交换,求出交换后的值

1
a = (a >> 8) | (a << 8);

将最右边的0变成1

1
x|(x+1)

在最后一位加一个1

1
a << 1+1

最后一位取反

1
x ^ 1

把右数第k位变成1

1
x | (1 << (k-1))

把右数第k位变成0

1
x & ~ (1 << (k-1))

右数第k位取反

1
x ^ (1 << (k-1))

取末k位

1
x & (1 << k-1)

取右数第k位

1
x >> (k-1) & 1

参考:

https://www.zhihu.com/question/38206659/answer/736472332

https://zhuanlan.zhihu.com/p/37909700

http://www.matrix67.com/blog/archives/263