66

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

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

4

5 回答 5

64

& 是二进制的and。如果你有一个二进制值,而你and有另一个二进制值,那么结果将是两者的按位and。一个例子:

  01101010
& 01011001
= 01001000

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

于 2009-03-01T18:11:58.140 回答
27

二进制系统的两个基本运算是 OR 和 AND。

OR 表示“如果 A 开启或 B 开启”。一个真实的例子是两个并联的开关。如果任一允许电流通过,则电流通过。

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

在计算机中,这些不是物理开关而是半导体,它们的功能被称为逻辑门。它们做与开关相同的事情——对电流或无电流作出反应。

当应用于整数时,一个数字中的每一位都与另一个数字中的每一位相结合。因此,要了解按位运算符 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,那么您的整数将比浮点数具有更高的精度。

于 2009-03-02T05:26:43.510 回答
19

了解按位和 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
于 2009-03-01T18:13:32.117 回答
15

我知道您的问题是关于理解按位运算符,并且接受的答案很好地解释了它。但是对于您给出的示例,我不禁建议您改用模运算符:

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

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

于 2009-03-16T21:50:16.727 回答
12

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

if(func1() && func2())

只会func2()func1()返回 true 时调用(“惰性求值”),而

if(func1() & func2())

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


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

于 2010-01-31T19:25:14.913 回答