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

和 XOR 不 或 左/右转


当前回答

它在sql关系模型中也很方便,假设你有以下表:BlogEntry, BlogCategory

传统上,你可以使用BlogEntryCategory表在它们之间创建一个n-n关系 或者当没有那么多的BlogCategory记录时,你可以在BlogEntry中使用一个值来链接到多个BlogCategory记录,就像你会用标记的枚举做的那样, 在大多数RDBMS中,也有一个非常快速的操作符来选择'标记'列…

其他回答

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

当我有一堆布尔标记时,我喜欢将它们全部存储在一个整型中。

我用bitwise-AND取出它们。例如:

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

etc.

似乎没有人提到定点数学。

(是的,我老了,好吗?)

& =和: 屏蔽掉特定的位。 您正在定义应该显示的特定位 或者不显示。0x0 & x将清除字节中的所有位,而0xFF不会改变x。 0x0F将显示较低位置的位。

转换: 要将较短的变量转换为具有位标识的较长的变量,必须调整位,因为int类型中的-1是0xFFFFFFFF,而long类型中的-1是0xffffffffffffffffff。为了保护 转换后应用掩码的标识。

| =或 位设置。如果已经设置了位,则位将独立设置。许多数据结构(位字段)有IS_HSET = 0, IS_VSET = 1这样的标志,可以独立设置。 要设置标志,您应用IS_HSET | IS_VSET(在C和汇编中,这是非常方便阅读的)

^ = XOR 找出相同或不同的部分。

~ =不 比特翻转。

可以证明,所有可能的局部位操作都可以通过这些操作来实现。 如果你愿意,你可以通过位操作来实现ADD指令。

以下是一些妙招:

http://www.ugcs.caltech.edu/~wnoise/base2.html http://www.jjj.de/bitwizardry/bitwizardrypage.html

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

int options = 0;

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

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

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