位运算符的真实世界使用案例

280

以下是一些与实际应用有关的位运算符:

  • AND(&)
  • XOR(^)
  • NOT(~)
  • OR(|)
  • 左/右移位(<< / >>)

1
我还记得当我第一次了解它们时,似乎它们只用于低级编程...但自那以后,它们已经进入我的工具箱,我经常使用它们,包括在进行“高级”编程时。现在它们对我来说就像+和*一样。 - Oak
2
@Anon:在我看来,现实世界应该指的是除了位运算符最明显的低级编程之外的任何东西。 - Olivier Lalonde
位运算的实际应用 - phuclv
可以使用二进制异或运算在排列中找到缺失的数字:https://www.martinkysel.com/codility-permmissingelem-solution/ - Janac Meena
41个回答

1

1

我认为这不算是位运算,但 Ruby 的 Array 通过普通的整数位运算符定义了集合操作。所以 [1,2,4] & [1,2,3] # => [1,2]。同样地,a ^ b #=> 差集a | b #=> 并集


1
一个非常具体的例子,但我用它们使我的数独求解器运行得更快(我正在与朋友比赛)。
每列、每行和3x3方格都表示为无符号整数,并且当我设置数字时,我会为相关列、行和3x3方格中设置的数字标记适当的位。
然后,这使得很容易看出我可以在给定方格中放置哪些可能的数字,因为我会将正确的列、行和3x3方格结合起来,然后对其进行NOT运算,以留下代表给定位置的可能合法值的掩码。
希望这样说清楚了。

1

还没有人提到集合。有时您可能拥有一小组可能的值,例如仅有10或20个可能的值,并且您想将其中一些保留在集合中。当然,您可以使用常规的Set实现,它很可能会使用后备哈希表。但是,由于可能的值集非常小,因此这实际上只是浪费时间和空间。相反,您可以将集合存储在单个intlong值中,这正是Java EnumSet所做的(如果我记得正确的话)。


老实说,我越想越觉得,除了在比其他运营商表现更好的情况下,一切都与收藏有关。 - undefined

1
Tower of Hanoi的线性解法使用位运算来解决问题。
public static void linear(char start, char temp, char end, int discs)
{
    int from,to;
    for (int i = 1; i < (1 << discs); i++) {
        from = (i & i-1) % 3;
        to = ((i | i-1) + 1) % 3;
        System.out.println(from+" => "+to);
    }
}

这个解决方案的说明可以在这里找到。


0

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

对于任何2的幂次方的对齐方式,下一个对齐位置可以按以下方式计算:

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


0

我之前写了一篇小型维基百科文章,展示了一个二进制读写器。它在位级别上工作,并展示了如何使用位运算符来打包数据。这可能是一个“真实世界”的例子,因为它在游戏中有应用。


0
我一直认为位运算是相当简单的操作,因此在运行时间很重要时,通过位集实现的解决方案可以通过恒定量改善运行时间,具体取决于算法。

0

在数据库世界中,另一个真实的应用是MySQL,它有一种叫做SET的数据类型。

位运算符可用于DBMS以存储SET数据类型。SET可以节省空间。

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

0

我使用它们来实现快速的BCD计算(会计师和审计师对浮点舍入感到烦恼)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接