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

shi*_*hin 20 php bitwise-operators logical-operators

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

但是,没有一个解释我何时应该使用按位或逻辑.

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

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

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

Joh*_*ast 24

Bitwise对于PHP中的东西非常有用.

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

<?php

// since we're setting constant values in base10 we must progressively double
// them since bitwise operations work in base2. you'll see why when we output
// these as binary values below.
const STATE_FOO = 1;
const STATE_BAR = 2;
const STATE_FEZ = 4;
const STATE_BAZ = 8;

// show base2 values of the above constants
echo sprintf("STATE_FOO's base2 value is %08d\n", decbin(STATE_FOO));
echo sprintf("STATE_BAR's base2 value is %08d\n", decbin(STATE_BAR));
echo sprintf("STATE_FEZ's base2 value is %08d\n", decbin(STATE_FEZ));
echo sprintf("STATE_BAZ's base2 value is %08d\n\n", decbin(STATE_BAZ));

// set state to FOO and FEZ
$state = STATE_FOO | STATE_FEZ;

echo sprintf("base10 value of \$state is %s\n", $state);
echo sprintf("base2 value of \$state is %08d\n", decbin($state));
echo sprintf("Does \$state include FOO state? %s\n", (bool)($state & STATE_FOO));
echo sprintf("Does \$state include BAR state? %s\n", (bool)($state & STATE_BAR));
echo sprintf("Does \$state include FEZ state? %s\n", (bool)($state & STATE_FEZ));
echo sprintf("Does \$state include BAZ state? %s\n", (bool)($state & STATE_BAZ));
echo sprintf("Is state equivalent to FOO and FEZ states? %s\n", ($state == (STATE_FOO | STATE_FEZ)));
Run Code Online (Sandbox Code Playgroud)


Bol*_*ock 15

按位|&和逻辑||&&完全不同的.

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

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

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

if ($either_this || $or_this) {
    // Either expression was true
}
Run Code Online (Sandbox Code Playgroud)


Ips*_*out 6

位运算符专门用于二进制值表示的情况.

echo '0110011010' & '0101001001'; 
//0100001000
Run Code Online (Sandbox Code Playgroud)

逻辑运算符最适合进行比较,并且在运算ANDXOR运算时比位运算符快一点.

if(func1() && func2())
Run Code Online (Sandbox Code Playgroud)

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

if(func1() & func2())
Run Code Online (Sandbox Code Playgroud)

无论返回值如何,都将调用这两个函数.


Oli*_*rth 5

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

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


unc*_*exo 5

忘掉脑子里已有的东西。

好的,现在说您有一些不同的角色:adminuserguest

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

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

// 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

function isAllowed($role, $permissison) {
    return $role & $permissison ? true : false;
}
Run Code Online (Sandbox Code Playgroud)

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

var_dump(isAllowed($admin, $delete));  // bool(true)
var_dump(isAllowed($user, $delete));   // bool(false)
var_dump(isAllowed($guest, $delete));  // bool(false)
Run Code Online (Sandbox Code Playgroud)

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

  • 我所理解的最好的答案! (3认同)