繁体   English   中英

布尔值的按位运算

[英]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中不支持的操作数类型

因此,我有两个问题:

  1. &&||有什么意义? ,如果我们(看起来)可以使用&| 代替布尔值?
  2. 为什么我不能做到~true (或者换句话说,为什么不支持布尔值)? 对我来说,这听起来合乎逻辑的~true返回false

我确实提出了一件事,就是&&|| 如果我们(错误地)碰巧传递了一个非bool类型的值,将(有时)将值转换为bool并随后返回正确的结果。 但是要解决这个问题,我们不能先做演员吗? 如:

if ((bool)$foo & (bool)$bar) { ...

感觉好像我在这里遗漏了一件会改变所有事情的重要作品……但是以防万一,我没有提供尽可能多的信息。 有人可以回答我的两个问题,使我对此有所了解吗? 在这一点上我很困惑,并且已经考虑了很长时间。

答案1

布尔表达式的一部分( ||&&! ,...)仅在需要时才评估(从左到右):

  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

答案2

~true似乎不是有意义的: true0x00...01~true0xff...fe ,而不是false 0x000...0

var_dump(~((int)true)); // prints: int(-2)
echo dechex(~((int)true)); // prints: fffffffffffffffe

使用! -运算符:

var_dump(!true); // prints: bool(false)

恢复

仅在需要更改位时才使用按位运算符。

truefalse布尔标志,尽管以32位或64位值的形式存储在内存中,但应将其视为两个状态的布尔值。 您最终将只在护罩上使用它,因此不要对它们进行算术运算。 &&|| 计算为布尔标志,按位运算符&和| 计算结果与操作数相同(例如, int & int计算为intint && int计算为布尔值)。

故事是:使用&&|| 当您必须在某些条件下做出决定时。 使用&| 对值执行布尔算术。

那是C ++

C没有任何内置的布尔值,因此任何非零值都是true ,而零是false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM