理解PHP& (&符号,按位和)运算符

时间:2009-03-01 18:06:53

标签: php operators bit-manipulation bitwise-operators

我经常在我的代码中使用($var & 1),如果$var是奇数,则返回true,如果是偶数,则返回false。

但“&”是什么实际上呢?

5 个答案:

答案 0 :(得分:59)

&安培;是二进制and。如果您有二进制值,并且and具有另一个二进制值,则结果将是两者的按位and。一个例子:

  01101010
& 01011001
= 01001000

最右边的位是1(在这种情况下,数字是奇数)或者是0,在这种情况下,数字是偶数。如果你&一个数字为1,你只查看最低有效位,if检查数字是1还是0.正如其他人提到的那样,查看按位运算符,了解它们的信息工作

答案 1 :(得分:25)

两个对二进制系统至关重要的操作是OR和AND。

OR表示'如果A打开或B打开'。一个真实的例子是并行的两个开关。如果其中一个允许电流通过,则电流通过。

AND表示'如果A和B都打开'。现实世界的例子是两个串联的开关。只有当两者都允许电流通过时,电流才会通过。

在计算机中,这些不是物理开关,而是半导体,它们的功能称为logic gates。它们与开关做同样的事情 - 对电流或无电流做出反应。

当应用于整数时,一个数字中的每个位与另一个数字中的每个位组合。因此,要理解按位运算符OR和AND,需要将数字转换为二进制,然后对每对匹配位执行OR或AND运算。

这就是为什么:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

尽管

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

因此,(& 1)操作使用AND逻辑将最右边的位与1进行比较。所有其他位都被有效忽略,因为任何东西都没有任何东西。二进制中的偶数也是十进制表示法中的偶数(10是2的倍数)。

二进制系统的其他基本操作包括NOT和XOR。 NOT表示“如果A关闭”,并且是唯一一种只接受一个信号或“参数”而不是两个信号的逻辑门形式。 XOR表示'如果A或B打开,但不是两者'。然后是NAND,NOR和NXOR,它们基本上没有与AND,OR和XOR结合,即NAND意味着'如果A和B 两者都在'。

在编程中,操作员

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

其他可以通过组合这些来组成,例如:

~ (a & b) is equivalent to a NAND operation

PHP特定说明

按位运算符不适用于浮点值,而PHP浮点值将首先隐式转换为整数。可以表示为整数的范围之外的数字将被截断为零 - 也就是说,PHP_INT_MAX上的所有数字在表达式($num & 1)中看起来都是“偶数”。如果要支持PHP_INT_MIN / PHP_INT_MAX之外的数字,则需要fmod($num, 2)但是,如果您使用的是64位PHP,那么整数将比浮点数具有更高的精度。

答案 2 :(得分:18)

了解bitwise和PHP也很有趣:

/**
 * Regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * Bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0

答案 3 :(得分:13)

除了其他答案外,值得注意的是

if(func1() && func2())

如果func2()返回true(“延迟评估”),则只会调用func1(),而

if(func1() & func2())

无论如何都会调用这两个函数,但两者的真值表都是相同的(假设它们返回布尔值)。


thomasrutter指出(在下面的评论中)你可能不应该在实践中做后者。 (A & B)不一定与(A && B)具有相同的真实性,尤其是AB为整数时。例如,如果A = 1且B = 2(两者都是真实的),A& B将是假的,而A&& amp; B是真实的。此外,另一位开发人员可能认为这是一个拼写错误,并将其“更正”为两个&符号。

答案 4 :(得分:12)

我知道你的问题是关于理解按位运算符,并且接受的答案解释得很好。但是对于你给出的例子,我不禁建议你使用模运算符:

($var % 2) /* instead of */ ($var & 1)

因为它清楚地表明您正在检查数字是否为奇数(不能被2整除),并且它更通用,所以您可以使用相同的方式使用($ var%3)并推断它的工作原理任何N.