Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 布尔值的位运算_Php_Bit Manipulation_Bitwise Operators - Fatal编程技术网

Php 布尔值的位运算

Php 布尔值的位运算,php,bit-manipulation,bitwise-operators,Php,Bit Manipulation,Bitwise Operators,据我所知,按位运算符对所有对应的位执行检查,如下所示: echo 64 | 32; //prints 96 echo 'a' & 'b'; //prints ` 当有条件的&&和|运算符对布尔值执行操作时: echo (int)(true && false); //prints: 0 echo (int)(true || false); //prints: 1 当我(在我的头脑中)想要预测按位运算的结果时,我首先将值转换为它们的二进制表示形式(这取决于数据类型)。

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

echo 64 | 32;   //prints 96
echo 'a' & 'b'; //prints `
当有条件的
&&
|
运算符对布尔值执行操作时:

echo (int)(true && false); //prints: 0
echo (int)(true || false); //prints: 1
当我(在我的头脑中)想要预测按位运算的结果时,我首先将值转换为它们的二进制表示形式(这取决于数据类型)。在此之后,我逐位比较,并将结果转换为合适的输出类型(我认为这是由操作数决定的)。尽管有一次,我尝试对布尔值进行同样的处理,据我所知,布尔值在内存中只包含一位,使
true
对应
1₂,并使
为假
对应于
0₂(二进制)。因此,对这些值执行按位操作应该会产生与
&
| |
类似的结果,对吗?让你明白我的意思:

true & false    =>      1₂ & 0₂      =>      0₂     =>     false
true | false    =>      1₂ | 0₂      =>      1₂     =>     true
~true           =>      ~1₂          =>      0₂     =>     false
(不包括异或,因为没有相应的条件布尔运算符。)

在我看来,这种行为应该真正等同于条件运算符:

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";
感觉好像我错过了一个改变一切的重要部分。。。但为了以防万一,我尽可能多地提供信息。有人能通过回答我的两个问题让我更好地理解这一点吗?在这一点上我很困惑,我已经思考了很长时间。

答案1 布尔表达式的部分(
|
&&
,…)仅在需要时(从左到右)进行求值:

请查看文档:

答复2
~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

位运算符不返回布尔值,除非它们对布尔值进行操作,比较运算符总是返回布尔结果。。。。这是一个非常大的差异。两个整数值上的按位运算符将返回一个整数值。。。e、 g.(使用8位简化)
00001100
|
00000111
将返回
00001111
00001111
&
01010101
将返回
00000101
@Mark Baker,这是真的,尽管这就是为什么我假设某个地方的显式强制转换是合适的(如我的上一个示例)。我的意思是,如果条件运算符(或比较运算符)有两个不同的值,它们需要先转换,对吗?那么,无论操作员是谁,都不会发生这种情况吗?或者我提供的最后一个代码还有其他缺点吗?(换句话说,
8
7
不是这样铸造的:
(bool)8 |(bool)7
,即使我们使用
8 | | 7
),当PHP将对布尔值进行隐式转换时,为什么还要有显式转换的开销来进行比较呢。。。。一旦值是布尔值,比较可能比按位操作快。因为PHP是开源的,所以您可以随时查看源代码。。。。但是这两种类型的操作符是为不同的目的设计的。。。按位运算符将用于布尔运算,但它们的优势在于用于非布尔运算。。。。因为PHP是松散类型的,所以比较运算符适用于任何数据类型。。。。这两种运算符的行为都有很好的文档记录,我想知道答案,但有一件事我还是不明白:为什么
~true
0x00…01
相同,而不是
0x0
?布尔值的大小不是1位吗?除此之外,第一个问题的答案似乎很好,所以非常感谢。不要再问我为什么我会偶然发现这个问题,但我又读了一遍(出于兴趣),意识到我理解了以前不理解的东西。如果有人会感兴趣(我怀疑),我将总结一下:似乎拥有与内存体系结构相关的单位变量还有其他困难(它们太小了,RAM不能处理它们)。这就解释了为什么布尔值占据更多的空间,为什么bitNOT在操作两个布尔值时不会产生相同的结果。(我会接受这个答案,因为我上次忘了这么做。)谢谢,但我没有完全理解这一点:“真布尔标志和假布尔标志,尽管作为32位或64位值存储在内存中,但应该被视为两种状态的布尔值。”。这意味着你不应该对它们进行数学运算(例如,将布尔值强制转换为int,然后使用其他变量对其进行位屏蔽)逐位运算符不是对位本身进行操作吗?我不知道这需要强制转换,我也不太理解你所说的数学运算。换句话说,
true&true
是否结束任何强制转换?
var_dump(~((int)true)); // prints: int(-2)
echo dechex(~((int)true)); // prints: fffffffffffffffe
var_dump(!true); // prints: bool(false)