我经常在代码中使用($var & 1),如果$var是奇数,则返回true,如果是偶数,则返回false。但是“&”实际上是做什么的呢?
($var & 1)
$var
64jmpszr1#
&是二进制的and .如果你有一个二进制值,而你用另一个二进制值and,那么结果将是按位的and这两个.例如:
and
01101010 & 01011001 = 01001000
最右边的位要么是1(在这种情况下,数字是奇数),要么是0(在这种情况下,数字是偶数)。如果你&一个数字为1,你只看最低有效位,如果检查数字是1还是0。正如其他人提到的,看看位运算符的工作原理。
&
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,那么整数的精度将比浮点数更高。*
($num & 1)
fmod($num, 2)
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
vfwfrxfs4#
我知道你的问题是关于位运算符的理解,而公认的答案很好地解释了它。但是对于你给予的例子,我不得不推荐你使用模运算符来代替:
($var % 2) /* instead of */ ($var & 1)
因为它的意图很清楚,你要检查的是奇数(不能被2整除),而且它更通用,所以你可以用同样的方法使用($var % 3),并推导出它对任何N的作用。
hs1ihplo5#
除了其他答案,值得注意的是
if(func1() && func2())
仅当func1()返回true(“延迟求值”)时才调用func2(),而
func1()
func2()
if(func1() & func2())
无论如何都将调用这两个函数,但两者的真值表将是相同的(假设它们返回布尔值)。托马斯拉特指出(A & B)不一定与(A && B)具有相同的真实性,特别是当A和B是整数时。例如,如果A=1和B=2(两者都是真的),A & B将是假的,而A && B是真的。另外,另一个开发人员可能认为这是一个错别字,并将其“更正”为两个&符号。
(A & B)
(A && B)
A
B
vd2z7a6w6#
欢迎回到堆栈溢出播客。当您考虑通过所有这些子系统跟踪备份数据时,请确保它在内存和速度以及另一端的所有不同客户端上运行良好。而且还试图构建一些非常棒的API和微服务,并与一百万个其他端点进行通信。他们将看到每一个供应商。非常感谢大家。
6条答案
按热度按时间64jmpszr1#
&是二进制的
and
.如果你有一个二进制值,而你用另一个二进制值and
,那么结果将是按位的and
这两个.例如:最右边的位要么是1(在这种情况下,数字是奇数),要么是0(在这种情况下,数字是偶数)。如果你
&
一个数字为1,你只看最低有效位,如果检查数字是1还是0。正如其他人提到的,看看位运算符的工作原理。55ooxyrt2#
二进制系统的两个基本运算是OR和AND。
“或”表示“如果A导通或B导通”。一个真实的的例子是两个并联的开关。如果其中一个允许电流通过,则电流通过。
AND表示“如果A和B都打开”。真实的世界的例子是两个串联的开关。只有当两个开关都允许电流通过时,电流才会通过。
在计算机中,这些不是物理开关,而是半导体,它们的功能被称为logic gates,它们做的事情与开关相同--对电流或无电流作出React。
当应用于整数时,一个数字中的每一位都与另一个数字中的每一位组合在一起。因此,要理解按位运算符OR和AND,需要将数字转换为二进制,然后对每一对匹配的位进行OR或AND运算。
这就是为什么:
鉴于
因此,(& 1)运算使用AND逻辑将最右边的位与1进行比较。所有其他位实际上都被忽略,因为任何与零都不等于零。二进制中的偶数在十进制记法中也是偶数(10是2的倍数)。
二进制系统的其他基本运算包括NOT和XOR。NOT表示“如果A关闭”,是逻辑门的唯一形式,它只接受一个信号或“参数”而不是两个。XOR表示“如果A或B打开,但不是两个都打开”。然后还有NAND、NOR和NXOR,它们基本上只是NOT与AND、OR和XOR的组合。即NAND表示“如果A和B * 不 * 都接通”。
在编程中,操作员
其他的可以通过组合这些来组成,例如:
PHP特定注意事项
位运算符不适用于浮点值,在PHP中浮点值会先隐式转换为整数。超出整数范围的数字会被截断为零-也就是说,所有超过PHP_INT_MAX的数字在表达式
($num & 1)
中看起来都是“偶数”。如果您想支持PHP_INT_MIN/PHP_INT_MAX之外的数字,您将需要fmod($num, 2)
。* 但是,如果您使用的是64位PHP,那么整数的精度将比浮点数更高。*bkkx9g8r3#
了解按位和PHP也很有趣:
vfwfrxfs4#
我知道你的问题是关于位运算符的理解,而公认的答案很好地解释了它。但是对于你给予的例子,我不得不推荐你使用模运算符来代替:
因为它的意图很清楚,你要检查的是奇数(不能被2整除),而且它更通用,所以你可以用同样的方法使用($var % 3),并推导出它对任何N的作用。
hs1ihplo5#
除了其他答案,值得注意的是
仅当
func1()
返回true(“延迟求值”)时才调用func2()
,而无论如何都将调用这两个函数,但两者的真值表将是相同的(假设它们返回布尔值)。
托马斯拉特指出
(A & B)
不一定与(A && B)
具有相同的真实性,特别是当A
和B
是整数时。例如,如果A=1和B=2(两者都是真的),A & B将是假的,而A && B是真的。另外,另一个开发人员可能认为这是一个错别字,并将其“更正”为两个&符号。vd2z7a6w6#
欢迎回到堆栈溢出播客。当您考虑通过所有这些子系统跟踪备份数据时,请确保它在内存和速度以及另一端的所有不同客户端上运行良好。而且还试图构建一些非常棒的API和微服务,并与一百万个其他端点进行通信。他们将看到每一个供应商。非常感谢大家。