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

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

但是“&”究竟做了什么?

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

  01101010 & 01011001 = 01001000 

最右边的位是1(在这种情况下,数字是奇数),或者是0,在这种情况下,数字是偶数。 如果你有一个1的数字,你只看最不重要的位,如果检查数字是1还是0,就像其他人所说的那样,看一下位运算符,了解它们是如何工作的。

二元系统的两个基本操作是OR和AND。

OR意思是“如果A打开或B打开”。 一个真实世界的例子是两个并联的开关。 如果任一个允许电stream通过,则电stream通过。

AND表示“如果A和B都打开”。 真实世界的例子是两个串联的开关。 如果两者都允许电stream通过,电stream只能通过。

在计算机中,这些不是物理交换机,而是半导体,它们的function被称为逻辑门 。 他们和开关做同样的事情 – 对电stream或电stream做出反应。

当应用于整数时,一个数字中的每一位与另一个数字中的每一位相结合。 因此,要理解按位运算符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。 不意味着“如果Aclosures”,并且是仅仅取一个信号或“参数”而不是两个的逻辑门的唯一forms。 异或是指'如果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上的所有数字在expression式($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 

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

 if(func1() && func2()) 

如果func1()返回true(“懒评估”),只会调用func2()

 if(func1() & func2()) 

不pipe调用两个函数,但是两者的真值表都是相同的(假设它们返回布尔值)。


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

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

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

因为它明确表示你正在检查数字是奇数(不能被2整除),而且它是更通用的,所以你可以用同样的方法使用($ var%3)并且推导出它对于任何N的工作原理。