以下是一些与实际应用有关的位运算符:
- AND(&)
- XOR(^)
- NOT(~)
- OR(|)
- 左/右移位(<< / >>)
以下是一些与实际应用有关的位运算符:
yourNumber & 2^N-1
,在这种情况下与yourNumber % 2^N
相同。请注意保留HTML标记。number % 16 = number & 15;
number % 128 = number & 127;
这可能只有在被除数非常大且为2^N时才有用,作为模运算的替代方案...但即使如此,在我的.NET 2.0测试中,它比模运算的速度提升微不足道。我怀疑现代编译器已经执行了像这样的优化。有人对此了解更多吗?
uint
传递给%
,则当第二个参数是预先已知的2的幂时,C#编译器实际上会生成使用按位AND的机器代码。 - Aaron Frankechar newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs
我使用它们来进行多选选项,这样我只需要存储一个值而不是10个或更多的值。
在SQL关系模型中,它也可以很方便。假设你有以下表格:BlogEntry、BlogCategory。
传统上,你可以使用BlogEntryCategory表格之间创建一个n-n的关系,或者当BlogCategory记录不多时,你可以像使用标记枚举一样,在BlogEntry中使用一个值来链接多个BlogCategory记录。
在大多数关系数据库管理系统中,还有非常快速的运算符可以选择该“已标记”列...
它们主要用于位运算(惊喜)。以下是在PHP代码库中找到的一些实际示例。
字符编码:
if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {
数据结构:
ar_flags = other->ar_flags & ~SPL_ARRAY_INT_MASK;
数据库驱动程序:
dbh->transaction_flags &= ~(PDO_TRANS_ACCESS_MODE^PDO_TRANS_READONLY);
编译器实现:
opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;
我曾经看到它们被用于基于角色的访问控制系统。
x == 1
且y == 2
,那么x || y
的值为1,而x | y
的值为0。我也不明白为什么x^true
比!x
更好。它需要更多的输入、不太地道,如果x
恰好不是一个bool
类型,它也是不可靠的。 - David Thornleyx^true
优于 !x
的一种情况是 some->complicated().member->lookup ^= true;
。没有一元运算符的复合赋值版本。 - Ben Voigtint options = 0;
其中OPTION1
可能被定义为1,OPTION2
为2,OPTION3
为4,OPTION4
为8,OPTION5
为16,等等。
void addOption(int option)
将使用|
运算符将选项添加到选项中。
boolean hasOption(int option)
将使用&
运算符在选项中测试该选项。
我的问题在实际世界中有一个真正的用途 -
如何仅响应第一个WM_KEYDOWN通知?
在使用Windows C API消耗WM_KEYDOWN消息时,位30指定了先前的键状态。如果在发送消息之前按下了键,则该值为1,否则为零。
我在一些游戏开发书籍中看到过这种方法,它可以更高效地进行乘除运算。
2 << 3 == 2 * 8
32 >> 4 == 32 / 16
5>>1==2
,而不是2.5:00000101->00000010。 - vol7ron>>
和 <<
(并将模数转换为 &&
)。 - Aaron Franke