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

和 XOR 不 或 左/右转


当前回答

Base64编码就是一个例子。Base64编码用于将二进制数据表示为通过电子邮件系统(和其他目的)发送的可打印字符。Base64编码将一系列8位字节转换为6位字符查找索引。位操作,移位,'ing, 'ing, not'ing对于实现Base64编码和解码所需的位操作非常有用。

当然,这只是无数例子中的一个。

其他回答

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

不久前,我在维基上写了一篇小文章,展示了一个二进制的作者/读者。它在位级上工作,并展示了如何使用位操作符来打包数据。这可能是一个“现实世界”的例子,因为它在游戏中也有应用。

通常位运算比乘除运算快。所以如果你需要用一个变量x乘以9,你会用x<<3 + x这将比x*9快几个周期。如果此代码位于ISR中,则可以节省响应时间。

类似地,如果您想使用数组作为循环队列,那么使用逐位操作来处理环绕检查会更快(也更优雅)。(你的数组大小应该是2的幂)。例如:,你可以使用tail = ((tail & MASK) +1)而不是tail = ((tail +1) < size) ?尾+1:0,如果你想插入/删除。

另外,如果您想要一个错误标志将多个错误代码保存在一起,则每个位可以保存一个单独的值。您可以与它与每个单独的错误代码作为检查。这用于Unix错误代码。

此外,n位位图可以是一个非常酷而紧凑的数据结构。如果要分配一个大小为n的资源池,我们可以使用n位表示当前状态。

我经常使用位操作将选项的组合存储在一个整数中。

int options = 0;

其中OPTION1可以定义为1,OPTION2定义为2,OPTION3定义为4,OPTION4定义为8,OPTION5定义为16,…

void addOption(int option)将使用|操作符向options中添加一个选项。

boolean hasOption(int option)将使用&操作符来测试选项中的选项。

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

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