了解PHP&;(与、位与)运算符

了解PHP&;(与、位与)运算符,php,operators,bit-manipulation,bitwise-operators,Php,Operators,Bit Manipulation,Bitwise Operators,我经常在代码中使用($var&1),如果$var是奇数,则返回true;如果是偶数,则返回false 但是“&”实际上做什么呢?&是二进制的和。如果您有一个二进制值,并且使用另一个二进制值和,则结果将是这两个值的按位和。例如: 01101010 & 01011001 = 01001000 最右边的位要么是1(在这种情况下,数字是奇数),要么是0,在这种情况下,数字是偶数。如果您&一个带1的数字,则只查看最低有效位,If检查该数字是1还是0。正如其他人所提到的,查看按位运算符以了解其

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


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

&是二进制的
。如果您有一个二进制值,并且使用另一个二进制值
,则结果将是这两个值的按位
。例如:

  01101010
& 01011001
= 01001000

最右边的位要么是1(在这种情况下,数字是奇数),要么是0,在这种情况下,数字是偶数。如果您
&
一个带1的数字,则只查看最低有效位,If检查该数字是1还是0。正如其他人所提到的,查看按位运算符以了解其工作原理。

了解按位运算符和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

二元系统的两个基本运算是或和

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

表示“如果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中,浮点值将首先隐式转换为整数。超出可表示为整数的范围的数字将被截断为零-也就是说,在表达式
($num&1)
中,超过PHP_INT_MAX的所有数字都将看起来是“偶数”。如果您想支持PHP_INT_MIN/PHP_INT_MAX之外的数字,则需要
fmod($num,2)
。但是,如果您使用的是64位PHP,那么不管怎样,整数的精度都会高于浮点数。

我知道您的问题是关于理解逐位运算符的,公认的答案很好地解释了这一点。但对于您给出的示例,我不得不建议您使用模运算符:

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

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

以及其他答案,值得注意的是

if(func1() && func2())
如果
func1()
返回true(“惰性计算”),则只调用
func2()
,而

将调用这两个函数,但这两个函数的真值表是相同的(假设它们返回布尔值)



thomasrutter指出(在下面的评论中)在实践中你可能不应该做后者<代码>(A&B)不一定具有与
(A&B)
相同的真实性,特别是当
A
B
是整数时。e、 例如,如果A=1和B=2(都是真实的),A&B将是虚假的,而A&B是真实的。另外,另一个开发人员可能会认为这是一个输入错误,并将其“更正”为两个符号。

如果你能找到任何编程问题的答案,那不是很好吗?唯一的办法是,如果“简单”的问题和“谜题”一样被问出来。在此基础上,我认为这是一个正确的问题。不要低估那些成功的程序员,但不知道按位操作的人数。这是一个有效的问题,透彻的理解有助于解释电路、加密和散列等的低级工作。如果不知道在线手册在哪里,就无法编写php。还有一个明显的“操作员”部分。。。。手册上没有说明,但我当时找不到,现在也找不到。在提出问题之前,我会尽力尽职尽责。如果你认为一个问题是不必要的,为什么给一个困难的时间?我在这里得到的答案(包括对二进制文件的详细解释)的质量远远好于我自己15分钟对谷歌、PHP文档等的研究。这就是为什么这个社区是如此宝贵的资源。这个答案并不能真正解释在我看来,&&与&&有什么不同将这两个参数强制转换为布尔值,就像比较单个位一样以位方式进行比较:一个参数中的每一位与另一个参数中的每一位进行比较。“正则”被称为逻辑and/orIt。同样重要的是,要知道像&和|这样的位运算符对整数进行运算。此答案中的示例仅适用于
true
转换为
1
false
转换为
0
。如果您有
echo(“cheese”&4)
它将输出零,而
echo(“cheese”&4)
将输出true
if(func1() & func2())