下面的位运算符在现实世界中有哪些用例?

和 XOR 不 或 左/右转


当前回答

一个数x是2的幂吗?(例如,在计数器递增的算法中很有用,并且一个操作只执行对数次)

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

整数x的最高位是哪位?(例如,这可以用来找出比x大的2的最小次幂)

x |= (x >>  1);
x |= (x >>  2);
x |= (x >>  4);
x |= (x >>  8);
x |= (x >> 16);
return x - (x >>> 1); // ">>>" is unsigned right shift

整数x的最小1位是哪一位?(帮助找出能被2整除的次数。)

x & -x

其他回答

您可以使用它们作为一种快速而不常用的散列数据的方法。

int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;

我的问题在现实世界中是有用的 只响应第一个WM_KEYDOWN通知?

当在windows C api中使用WM_KEYDOWN消息时,第30位指定前一个键的状态。如果在发送消息之前键为down,则值为1;如果键为up,则值为0

我曾在一些游戏开发书籍中看到它是一种更有效的乘除方法。

2 << 3 == 2 * 8 
32 >> 4 == 32 / 16

一个常见的用法是对齐,例如我需要我的数据在4字节或16字节的边界上对齐。这在RISC处理器中非常常见,其中未对齐的加载/存储要么代价高昂(因为它触发了一个异常处理程序,然后需要修复未对齐的加载),要么根本不允许。

对于任何以2为幂的对齐,下一个对齐的pos可以计算如下:

aligned_offset = alignment + ((current_offset - 1) & ~(alignment - 1))

所以在4字节对齐和当前偏移量为9的情况下:

aligned_offset = 4 + ((9-1) & ~(4-1)) = 4 + (8 & 0xFFFFFFFC) = 4+ 8  = 12  

所以下一个4字节的对齐偏移量是12

大约三分钟前,我刚刚使用了位异或(^)来计算与PLC串行通信的校验和…