[英]Bitwise operations on boolean values
据我所知,按位运算符对所有相应位执行检查,如下所示:
echo 64 | 32; //prints 96
echo 'a' & 'b'; //prints `
有条件&&
和||
运算符对布尔值执行操作:
echo (int)(true && false); //prints: 0
echo (int)(true || false); //prints: 1
当我(脑海中)想要预测按位运算的结果时,我首先将这些值转换为它们的二进制表示形式(取决于数据类型)。 此后,我将其逐位比较,然后将结果转换为合适的输出类型(我猜这是由操作数确定的)。 尽管在某一时刻,我还是尝试对布尔值进行同样的操作,布尔值(据我所知)仅由内存中的一位组成,将true
对应于1₂
并将false
对应于0₂
(二进制)。 因此,对这些值执行按位运算应产生与&&
和||
类似的结果。 , 对? 为了说明我的意思:
true & false => 1₂ & 0₂ => 0₂ => false
true | false => 1₂ | 0₂ => 1₂ => true
~true => ~1₂ => 0₂ => false
(不包括xor
,因为没有相应的条件布尔运算符。)
在我看来,该行为实际上应该等同于条件运算符:
true && false => false
true || false => true
!true => false
因此,我将以下代码设置为对其进行测试:
echo "true AND false: " . ((true && false) ? "1" : "0") . "<br />\n";
echo "true OR false: " . ((true || false) ? "1" : "0") . "<br />\n";
echo "NOT true: " . ((!true) ? "1" : "0") . "<br />\n";
echo "<br />\n";
echo "true BITAND false: " . ((true & false) ? "1" : "0") . "<br />\n";
echo "true BITOR false: " . ((true | false) ? "1" : "0") . "<br />\n";
echo "BITNOT true: " . ((~true) ? "1" : "0") . "<br />\n";
它给了我以下输出:
正确与错误:0
正确还是错误:1
不正确:0真BITAND假:0
真BITOR假:1致命错误:第21行的C:\\ Abyss Web Server \\ htdocs \\ handler.php中不支持的操作数类型
因此,我有两个问题:
&&
和||
有什么意义? ,如果我们(看起来)可以使用&
和|
代替布尔值? ~true
(或者换句话说,为什么不支持布尔值)? 对我来说,这听起来合乎逻辑的~true
返回false
。 我确实提出了一件事,就是&&
和||
如果我们(错误地)碰巧传递了一个非bool
类型的值,将(有时)将值转换为bool
并随后返回正确的结果。 但是要解决这个问题,我们不能先做演员吗? 如:
if ((bool)$foo & (bool)$bar) { ...
感觉好像我在这里遗漏了一件会改变所有事情的重要作品……但是以防万一,我没有提供尽可能多的信息。 有人可以回答我的两个问题,使我对此有所了解吗? 在这一点上我很困惑,并且已经考虑了很长时间。
布尔表达式的一部分( ||
, &&
, !
,...)仅在需要时才评估(从左到右):
if ($a | func()) { } // func is always called
if ($a || func()) { } // func is not called if $a is true,
// because expression is true whatever func will return
if ($a && func()) { } // func is not called if $a is false,
// because expression is false whatever func will return
func() || exit(); // exit() will be called if func() returns false
看一下文档: http : //php.net/manual/en/language.operators.logical.php
~true
似乎不是有意义的: true
是0x00...01
和~true
会0xff...fe
,而不是false
0x000...0
:
var_dump(~((int)true)); // prints: int(-2)
echo dechex(~((int)true)); // prints: fffffffffffffffe
使用!
-运算符:
var_dump(!true); // prints: bool(false)
仅在需要更改位时才使用按位运算符。
true
和false
布尔标志,尽管以32位或64位值的形式存储在内存中,但应将其视为两个状态的布尔值。 您最终将只在护罩上使用它,因此不要对它们进行算术运算。 &&
和||
计算为布尔标志,按位运算符&和| 计算结果与操作数相同(例如, int & int
计算为int
, int && int
计算为布尔值)。
故事是:使用&&
和||
当您必须在某些条件下做出决定时。 使用&
和|
对值执行布尔算术。
那是C ++
C没有任何内置的布尔值,因此任何非零值都是true
,而零是false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.