我经常($var & 1)
在我的代码中使用,如果$var
是奇数则返回 true,如果是偶数则返回 false。
但是“&”实际上是做什么的呢?
我经常($var & 1)
在我的代码中使用,如果$var
是奇数则返回 true,如果是偶数则返回 false。
但是“&”实际上是做什么的呢?
& 是二进制的and
。如果你有一个二进制值,而你and
有另一个二进制值,那么结果将是两者的按位and
。一个例子:
01101010
& 01011001
= 01001000
最右边的位要么是 1(在这种情况下,数字是奇数),要么是 0,在这种情况下,数字是偶数。如果你&
是一个带 1 的数字,你只看最低有效位,if 检查数字是 1 还是 0。正如其他人提到的,查看位运算符以了解它们如何工作的信息。
二进制系统的两个基本运算是 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,那么您的整数将比浮点数具有更高的精度。
了解按位和 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
我知道您的问题是关于理解按位运算符,并且接受的答案很好地解释了它。但是对于您给出的示例,我不禁建议您改用模运算符:
($var % 2) /* instead of */ ($var & 1)
因为它清楚地表明您正在检查数字是否为奇数(不能被 2 整除),并且它更通用,所以您可以以相同的方式使用 ($var % 3) 并推断它对任何 N 的工作方式。
除了其他答案,值得注意的是
if(func1() && func2())
只会func2()
在func1()
返回 true 时调用(“惰性求值”),而
if(func1() & func2())
无论如何都会调用这两个函数,但两者的真值表将是相同的(假设它们返回布尔值)。
thomasrutter 指出(在下面的评论中)你可能不应该在实践中做后者。(A & B)
不一定具有与 相同的真实性(A && B)
,尤其是当A
和B
是整数时。例如,如果 A=1 且 B=2(均为真),则 A & B 将为假,而 A && B 为真。此外,另一位开发人员可能会认为这是一个错字,并将其“更正”为两个与号。