按位操作布尔值

据我所知,按位运算符会对所有相应的位进行检查,如下所示:

echo 64 | 32;   //prints 96
echo 'a' & 'b'; //prints `

而条件&&|| 运算符对布尔值执行操作:

echo (int)(true && false); //prints: 0
echo (int)(true || false); //prints: 1

当我(在我的脑海中)想要预测按位运算的结果时,我首先将这些值转换为它们的二进制表示形式(这取决于数据类型)。 在此之后,我将它逐位比较,并将结果转换为合适的输出类型(我认为这是由操作数决定的)。 虽然在某一时刻,我试着用布尔值来做同样的事情,据我所知,它只由内存中的一位组成,使得对应于1₂ true ,并使对应于0 1₂ 0₂ (二进制)成为false 。 因此,对这些值执行按位运算应该产生与&&||类似的结果 , 对? 向你展示我的意思:

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";

它给了我以下输出:

true和false:0
真或假:1
不正确:0

true BITAND false:0
true BITOR false:1

致命错误:第21行C: Abyss Web Server htdocs handler.php中不受支持的操作数类型

因此,我有两个问题:

  • &&||有什么意义? ,如果我们(看起来)可以使用&| 取而代之的是布尔值?
  • 为什么我不能做~true (或换句话说,为什么不支持布尔值)? 对我来说, ~true返回false听起来很合逻辑。
  • 我确实想出了一件事,就是&&|| 将(有时)将值转换为bool ,然后返回正确的结果,如果我们(错误地)传递一个不是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)
    

    恢复

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


    尽管作为32位或64位值存储在内存中,但true布尔标志和false布尔标志应被视为两状态布尔值。 你最终只会使用它在brach卫士上,所以你不应该对它们进行算术运算。 &&|| 评估为布尔标志,按位运算符&和| 评估为相同的操作数(例如, int & int评估为intint && int评估为布尔值)。

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

    这就是C ++

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

    链接地址: http://www.djcxy.com/p/13021.html

    上一篇: Bitwise operations on boolean values

    下一篇: if statement with ! before variable