我经常($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,那么你的整数将比浮点数具有更高的精度.
了解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
我知道你的问题是关于理解按位运算符,并且接受的答案解释得很好.但是对于你给出的例子,我不禁建议你使用modulo运算符:
($var % 2) /* instead of */ ($var & 1)
因为它清楚地表明您正在检查数字是否为奇数(不能被2整除),并且它更通用,所以您可以以相同的方式使用($ var%3)并推断它对任何N的工作方式.
除了其他答案,值得注意的是
if(func1() && func2())
只会调用func2()
if func1()
返回true("懒惰评估"),而
if(func1() & func2())
无论如何都会调用这两个函数,但两者的真值表都是相同的(假设它们返回布尔值).
thomasrutter指出(在下面的评论中)你可能不应该在实践中做后者.(A & B)
不一定具有相同的感实性的(A && B)
,特别是当A
和B
为整数.例如,如果A = 1且B = 2(两者都是真实的),A&B将是假的,而A && B则是真实的.此外,另一位开发人员可能认为这是一个拼写错误,并将其"纠正"为两个&符号.