常用位运算合集

获取某一位的值

比如取第 3 位(从右往左)的值。

任意值与 1 不变,与 0 为 0,通过这个方式可以判断任意位的值。首先 1 << (3 - 1) 得到 100。然后 100 & a 如果是 0 则第 3 位为0,否则为 1。

公式 num & (1 << (n - 1)),如果为 0 则第 n 位为 0,否则为 1。

另一种方式 num >> (n - 1) & 1, 结果为 0 则第 n 位为 0,为 1 则为 1。

修改某一位为 1 / 0

修改某一位为 1,这个很简单,置 1 操作肯定用到或运算,任意值或 1 为 1,或 0 不变。上面的例子得到了 100,只要使用或运算。就可以将第 3 位置为 1.

num | (1 <<(n - 1))

修改某一位为 0 稍微麻烦一点,任意值与 1 不变,与 0 为 0 ,所以置 0 操作一定用与运算。与上面的例子类似,不过要先取反,100 取反之后是 011,然后与 num 就可以把 第 3 为置为 0。

num & ~(1 <<(n - 1))

将某一位取反

取反操作需要用到异或运算。任意值异或 1 取反,而任意值异或 0 则不变。所以如果第 3 位取反只要异或 100 就可以了。

num ^ (1<<(n - 1))

将右侧第一个 1 置为 0

例如 num 是 1 1010 0100,最右侧第一个 1 置为 0 之后就是 1 1010 0000。其实目的也就是把 100 变为 000。可以先找到右侧第一个 1 是第几位,然后用上面的方法重置。但是有更简单的办法。

num & (num -1)

把 100 -1 得到 011,011 与 100 就得到了 0,而 任意值与自己也是不会变的,正好满足了这个情况。

另外,如果这里我们用或运算,则可以把右侧第一个 1 右边全部置为 1.

将右侧第一个 1 的右边都置为 1

num | (num - 1)

更多可以参考这里