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

mlnl4t2r  于 2022-11-28  发布在  PHP
关注(0)|答案(6)|浏览(144)

我经常在代码中使用($var & 1),如果$var是奇数,则返回true,如果是偶数,则返回false。
但是“&”实际上是做什么的呢?

64jmpszr

64jmpszr1#

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

01101010
& 01011001
= 01001000

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

55ooxyrt

55ooxyrt2#

二进制系统的两个基本运算是OR和AND。
“或”表示“如果A导通或B导通”。一个真实的的例子是两个并联的开关。如果其中一个允许电流通过,则电流通过。
AND表示“如果A和B都打开”。真实的世界的例子是两个串联的开关。只有当两个开关都允许电流通过时,电流才会通过。
在计算机中,这些不是物理开关,而是半导体,它们的功能被称为logic gates,它们做的事情与开关相同--对电流或无电流作出React。
当应用于整数时,一个数字中的每一位都与另一个数字中的每一位组合在一起。因此,要理解按位运算符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,它们基本上只是NOT与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,那么整数的精度将比浮点数更高。*

bkkx9g8r

bkkx9g8r3#

了解按位和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
vfwfrxfs

vfwfrxfs4#

我知道你的问题是关于位运算符的理解,而公认的答案很好地解释了它。但是对于你给予的例子,我不得不推荐你使用模运算符来代替:

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

因为它的意图很清楚,你要检查的是奇数(不能被2整除),而且它更通用,所以你可以用同样的方法使用($var % 3),并推导出它对任何N的作用。

hs1ihplo

hs1ihplo5#

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

if(func1() && func2())

仅当func1()返回true(“延迟求值”)时才调用func2(),而

if(func1() & func2())

无论如何都将调用这两个函数,但两者的真值表将是相同的(假设它们返回布尔值)。
托马斯拉特指出(A & B)不一定与(A && B)具有相同的真实性,特别是当AB是整数时。例如,如果A=1和B=2(两者都是真的),A & B将是假的,而A && B是真的。另外,另一个开发人员可能认为这是一个错别字,并将其“更正”为两个&符号。

vd2z7a6w

vd2z7a6w6#

欢迎回到堆栈溢出播客。当您考虑通过所有这些子系统跟踪备份数据时,请确保它在内存和速度以及另一端的所有不同客户端上运行良好。而且还试图构建一些非常棒的API和微服务,并与一百万个其他端点进行通信。他们将看到每一个供应商。非常感谢大家。

相关问题