我什么时候应该使用按位运算符?

时间:2011-01-16 14:21:17

标签: php bitwise-operators logical-operators

我阅读了以下Stack Overflow问题,我理解了bitwise和logical之间的区别。

然而,他们都没有解释我何时应该使用按位或逻辑。

我应该何时使用按位运算符而不是逻辑运算符,反之亦然?

在哪种情况下我需要逐位比较?

我不是在问这些差异,但是当你需要使用按位运算符时我会问这个情况。

9 个答案:

答案 0 :(得分:23)

Bitwise对于PHP中的内容非常有用。

可以同时打开多个状态的值(可能是权限)怎么样?

<?php

# must double them like this for it to work.
const STATE_FOO = 1;
const STATE_BAR = 2;
const STATE_FEZ = 4;
const STATE_BAZ = 8;

# set state to foo and fez
$state = STATE_FOO | STATE_FEZ;

echo "What's the value: $state\n";
echo "Is foo state on? ".(bool)($state & STATE_FOO)."\n";
echo "Is bar state on? ".(bool)($state & STATE_BAR)."\n";
echo "Is fez state on? ".(bool)($state & STATE_FEZ)."\n";
echo "Is baz state on? ".(bool)($state & STATE_BAZ)."\n";
echo "Is foo and fez state on? ".($state == (STATE_FOO | STATE_FEZ))."\n";

答案 1 :(得分:13)

按位|&以及逻辑||&& 完全不同

按位运算符对两个数的执行操作并返回结果。这意味着它不是是或否。如果它们在条件语句中使用,则它们经常被用作作为逻辑比较的一部分。例如:

if ($x & 2 == 2) {
    // The 2^1 bit is set in the number $x
}

逻辑运算符比较两个(或更多)条件/表达式并返回true或false。您最常在条件语句中使用它们,例如ifwhile。例如:

if ($either_this || $or_this) {
    // Either expression was true
}

答案 2 :(得分:5)

在大多数情况下,您可能希望使用逻辑运算符。它们用于组合逻辑条件,通常用于控制程序流程,例如, ($isAlive && $wantsToEat)

当您想要在整数的基础二进制表示上逐位执行操作时,使用按位运算符。例如(5 & 3) == 7。正如其他人所建议的那样,在那些倾向于用PHP编写的应用程序中通常没有太多的要求(尽管有较低级别的语言,比如C)。

答案 3 :(得分:5)

按位运算符专门用于二进制值表示。

echo '0110011010' & '0101001001'; 
//0100001000

逻辑运算符最适合进行比较,并且在ANDXOR运算的情况下比位运算符快一点。

if(func1() && func2())

如果func1()返回false,则不会打扰调用func2()

if(func1() & func2())

无论返回值是什么,都会调用这两个函数。

答案 4 :(得分:3)

在操作数字位时,按位运算符很有用。看here。否则你应该使用逻辑运算符。逻辑运算符也是短路的。例如,如果您a && bafalse,则不会评估b

免责声明:我来自Java背景,但我想在PHP中也是如此。

答案 5 :(得分:2)

忘掉脑海中已有的东西。

好的,现在说您有一些不同的角色:管理员用户来宾

和一些不同的权限:读取写入删除

让我们为权限角色创建一些位掩码。 位掩码是可用于操纵或读取某种标志的位序列。如下图所示:

// flags                                bitmasks
$read = 1;                              // 0001
$write = 2;                             // 0010
$delete = 4;                            // 0100

$admin = $read | $write | $delete;      // 0001 | 0010 | 0100 => 0111
$user = $read | $write;                 // 0001 | 0010 => 0011 
$guest = $read;                         // 0001 => 0001

注意1、2、4。必须加倍。否则,它可能会给您带来尴尬的结果。

忘记评论的内容。这些只是用于单个权限和角色的位序列(或位掩码)。

现在,我们创建一个方便的函数,该函数可用于检查特定角色的特定权限。

function isAllowed($role, $permissison) {
    return $role & $permissison ? true : false;
}

我们完成了。让我们检查所有3个角色的 $ delete 权限:

var_dump(isAllowed($admin, $delete));  // bool(true)
var_dump(isAllowed($user, $delete));   // bool(false)
var_dump(isAllowed($guest, $delete));  // bool(false)

那为什么要按位操作呢?一言以蔽之,按位操作更快,更简洁,更可维护。否则,对复杂的应用程序使用按位运算总是有效的。

答案 6 :(得分:1)

他们是两个非常不同的运营商。

如果您希望同时满足两个条件,则使用逻辑&&。例如,我想打印出“生日快乐”,只有当这个人的生日是今天&amp;&amp;他们在账户里有钱。每当我们想要执行两个或更多条件的组合时,就会使用它,主要是在if语句和循环条件中(尽管不是唯一的)。

如果要执行按位运算(在日常PHP编程中更为罕见),则使用按位&。这是非常罕见的,你可能正在执行按位掩码(我怀疑它),所以你可能只想要一个整数代表的结果,在这种情况下你可以说newAttribute = attribute1 & attribute2;

答案 7 :(得分:0)

好吧,假设有$x = (false && some_function());,此处$x的值将设置为some_function()而不调用$x = (false & some_function());,因为第一个值为FALSE。

但是如果你还需要调用那个函数怎么办?使用&

换句话说,&&使用比&amp;&amp;更多的处理,仅仅因为&amp;&amp;没有运行所有值来检查它们。如果它发现一个值为false,它将返回它,而不是查看其他值。

在逻辑运算中,使用&运算符,因为它用于返回逻辑运算值,其中if用于设置值和{{ 1}}语句它将始终返回true。

答案 8 :(得分:-1)

如果您想了解更多信息,请查看此网站:

http://www.bitwiseoperatorcalculator.com/

来自PHP,我以前从未使用它,但只是阅读本网站提供简单的解释!