布尔值的按位运算

最大限度

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

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) { ...

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

R1tschY

答案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似乎没有意义:trueis 0x00...01and ~truewill be 0xff...feand not false 0x000...0

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

使用!-operator代替:

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

恢复

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按位运算结果和布尔值

来自分类Dev

按位与如何与布尔值交互?

来自分类Dev

如何使用按位运算符交织2个布尔值?

来自分类Dev

在熊猫中按位运算返回数字而不是布尔值?

来自分类Dev

如何使用按位运算符交织2个布尔值?

来自分类Dev

为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

来自分类Dev

在布尔值上使用按位非运算符(〜)是否会调用未定义行为?

来自分类Dev

C ++中带有布尔值的^(按位XOR)

来自分类Dev

按布尔值排序

来自分类Dev

如果两个函数都返回布尔值,使用按位运算符将它们组合起来是否安全?

来自分类Dev

位向量与布尔值性能列表

来自分类Dev

MySQL按布尔值tinyint排序

来自分类Dev

MySQL按布尔值tinyint排序

来自分类Dev

按集合内的布尔值排序

来自分类Dev

为什么布尔值在C ++中按位进行比较,而不是按其含义进行比较?

来自分类Dev

按位运算以比较值

来自分类Dev

numpy中的内置函数可以按位方式将整数解释为布尔值数组吗?

来自分类Dev

F#如何通过AND运算返回布尔值?

来自分类Dev

内联NOT运算符,使用布尔值

来自分类Dev

PHP中具有布尔值的数学运算

来自分类Dev

是否有布尔值的后赋值运算符?

来自分类Dev

用于布尔值的比较运算符

来自分类Dev

返回布尔值 observable 的管道运算符

来自分类Dev

将4位整数转换为布尔值列表

来自分类Dev

将位掩码转换回9个布尔值

来自分类Dev

将位掩码转换回9个布尔值

来自分类Dev

为什么布尔类型不能快速进行按位运算

来自分类Dev

带有 numpy 的布尔矩阵 - 按位运算问题

来自分类Dev

按整数或布尔值过滤的数据库性能?

Related 相关文章

热门标签

归档