gpt4 book ai didi

php - bool 值的按位运算

转载 作者:行者123 更新时间:2023-12-04 02:23:21 25 4
gpt4 key购买 nike

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

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

虽然有条件 &&||运算符对 bool 值执行操作:
echo (int)(true && false); //prints: 0
echo (int)(true || false); //prints: 1

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

(不包括 xor ,因为没有相应的条件 bool 运算符。)

在我看来,这种行为应该真的等同于条件运算符:
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 AND false: 0
true OR false: 1
NOT true: 0

true BITAND false: 0
true BITOR false: 1

Fatal error: Unsupported operand types in C:\Abyss Web Server\htdocs\handler.php on line 21



所以从这里,我有两个问题:
  • &&有什么意义和 || ,如果我们(看起来)可以使用 &|改为使用 bool 值?
  • 为什么我做不到~true (或者换句话说,为什么不支持 bool 值)?对我来说,~true 听起来很合乎逻辑。返回 false .

  • 我确实想出了一件事,那就是 &&||将(有时)将值转换为 bool然后返回正确的结果,如果我们(错误地)碰巧传递了一个不是 bool 类型的值.但是要解决这个问题,我们不能先做一个 Actor 吗?如:
    if ((bool)$foo & (bool)$bar) { ...

    感觉就像我在这里错过了一个改变一切的主要部分......但为了以防万一,我尽可能多地包含了信息。有人可以通过回答我的两个问题让我更好地理解这一点吗?在这一点上我很困惑,我已经考虑了很长一段时间。

    最佳答案

    答案 1

    bool 表达式的一部分( ||&&! 、...)仅在需要时进行评估(从左到右):

      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~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)

    恢复

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

    关于php - bool 值的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25875755/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com