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

和 XOR 不 或 左/右转


当前回答

下面是一些处理将标志存储为单个位的常见习惯用法。

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

设置Chargeable标志:

flags |= Chargeable;

清除CallerIDMissing标记:

flags &= ~CallerIDMissing;

测试CallerIDMissing和Chargeable是否设置:

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}

其他回答

按位&用于屏蔽/提取字节的某一部分。

1字节变量

 01110010
&00001111 Bitmask of 0x0F to find out the lower nibble
 --------
 00000010

特别是移位运算符(<< >>)经常用于计算。

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

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

我一直假设按位操作是相当简单的操作,所以当运行时间至关重要时,通过bitset实现的解决方案可以通过恒定的数量提高运行时间,这取决于算法。

数据库世界中的另一个真实应用程序是MySQL,它的数据类型是SET。

位操作符由DBMS存储SET数据类型。设置可以节省空间。

Element    SET Value    Decimal Value
Travel      00000001    1
Sports      00000010    2
Dancing    00000100    4
Fine Dining   00001000  8

我见过它们在基于角色的访问控制系统中使用。