什么时候应该使用按位运算符?
我阅读了以下堆栈溢出问题,并了解了按位和逻辑之间的差异。
PHP中&和&&的区别
参考 - 这个符号在PHP中的含义是什么?
但是,它们中的任何一个都不能解释什么时候应该使用按位或逻辑。
什么时候应该使用按位运算符而不是逻辑运算符,反之亦然?
在哪种情况下我需要逐点比较?
我不是在问这些差异,但是我在问你什么时候需要使用按位运算符。
按位|
和&
和逻辑||
和&&
完全不同。
按位运算符对两个数的位执行操作并返回结果。 这意味着这不是一件事,也不是一件事。 如果它们用于条件语句中,它们通常用作逻辑比较的一部分。 例如:
if ($x & 2 == 2) {
// The 2^1 bit is set in the number $x
}
逻辑运算符比较两个(或更多)条件/表达式并返回true或false。 在条件语句中最常用它们,如if
和while
。 例如:
if ($either_this || $or_this) {
// Either expression was true
}
与其他任何东西一样,Bitwise对PHP中的东西也很有用。
如何可以同时打开多个状态的值(可能是权限)?
<?php
# must double them like this for it to work.
const STATE_FOO = 1;
const STATE_BAR = 2;
const STATE_FEZ = 4;
const STATE_BAZ = 8;
# set state to foo and fez
$state = STATE_FOO | STATE_FEZ;
echo "What's the value: $staten";
echo "Is foo state on? ".(bool)($state & STATE_FOO)."n";
echo "Is bar state on? ".(bool)($state & STATE_BAR)."n";
echo "Is fez state on? ".(bool)($state & STATE_FEZ)."n";
echo "Is baz state on? ".(bool)($state & STATE_BAZ)."n";
echo "Is foo and fez state on? ".($state == (STATE_FOO | STATE_FEZ))."n";
在大多数情况下,您可能会想要使用逻辑运算符。 它们用于组合逻辑条件,通常用于控制程序流程,例如($isAlive && $wantsToEat)
。
当您希望在整数的基础二进制表示中逐位执行操作时,使用位运算符。 例如(5 & 3) == 7
。 正如其他人所建议的那样,在那些倾向于使用PHP编写的应用程序中,通常没有太多要求(尽管存在低级语言,如C)。