以下是一些与实际应用有关的位运算符:
- AND(&)
- XOR(^)
- NOT(~)
- OR(|)
- 左/右移位(<< / >>)
以下是一些与实际应用有关的位运算符:
我将它们用作选项处理程序,例如在访问控制列表中描述特定资源。
看一下这篇文章http://planetozh.com/blog/2006/05/php-bitwise-operators-example-of-use/
编辑:还有一个链接:http://blog.code-head.com/how-to-write-a-permission-system-using-bits-and-bitwise-operations-in-php
我认为这不算是位运算,但 Ruby 的 Array 通过普通的整数位运算符定义了集合操作。所以 [1,2,4] & [1,2,3] # => [1,2]
。同样地,a ^ b #=> 差集
和 a | b #=> 并集
。
还没有人提到集合。有时您可能拥有一小组可能的值,例如仅有10或20个可能的值,并且您想将其中一些保留在集合中。当然,您可以使用常规的Set
实现,它很可能会使用后备哈希表。但是,由于可能的值集非常小,因此这实际上只是浪费时间和空间。相反,您可以将集合存储在单个int
或long
值中,这正是Java EnumSet
所做的(如果我记得正确的话)。
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);
}
}
这个解决方案的说明可以在这里找到。
一个常见的用途是对齐,例如我需要将我的数据对齐到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
在数据库世界中,另一个真实的应用是MySQL,它有一种叫做SET的数据类型。
位运算符可用于DBMS以存储SET数据类型。SET可以节省空间。
Element SET Value Decimal Value
Travel 00000001 1
Sports 00000010 2
Dancing 00000100 4
Fine Dining 00001000 8
我使用它们来实现快速的BCD计算(会计师和审计师对浮点舍入感到烦恼)。