我阅读了下面的堆栈溢出问题,并且理解了按位和逻辑之间的区别。
然而,他们都没有解释什么时候我应该使用按位或逻辑。
什么时候应该使用按位运算符而不是逻辑运算符,反之亦然?
在哪种情况下,我需要一点一点地比较?
我不是要问差异,但我问的情况,当你需要使用按位运算符。
发布于 2011-01-16 14:26:31
按位|和&与逻辑||和&&完全不同。
按位运算符对两个数字的位执行操作并返回结果。这意味着这不是一个是或不是的东西。如果在条件语句中使用它们,则通常用作逻辑比较的一部分。例如:
if ($x & 2 == 2) {
// The 2^1 bit is set in the number $x
}逻辑运算符比较两个(或更多)条件/表达式,并返回true或false。您最常在条件语句中使用它们,比如if和while。例如:
if ($either_this || $or_this) {
// Either expression was true
}发布于 2015-01-16 21:46:29
与其他任何东西一样,位操作对于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)));输出:
STATE_FOO's base2 value is 00000001
STATE_BAR's base2 value is 00000010
STATE_FEZ's base2 value is 00000100
STATE_BAZ's base2 value is 00001000
base10 value of $state is 5
base2 value of $state is 00000101
Does $state include FOO state? 1
Does $state include BAR state?
Does $state include FEZ state? 1
Does $state include BAZ state?
Is state equivalent to FOO and FEZ states? 1发布于 2018-11-23 15:10:46
忘记你脑子里已经存在的东西。
好的,现在假设您有一些不同的角色:管理、用户和来宾。
以及一些不同的权限:read、read和delete
让我们为权限、和角色创建一些位掩码。位掩码是一组位序列,可以用来操作或读取某种标志。如下所示:
// 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;
}我们说完了。让我们检查所有三个角色的$delete权限:
var_dump(isAllowed($admin, $delete)); // bool(true)
var_dump(isAllowed($user, $delete)); // bool(false)
var_dump(isAllowed($guest, $delete)); // bool(false)那么为什么是按位操作呢?总之,按位操作更快、更简洁、更易于维护。否则,对于复杂的应用程序,使用按位操作总是有效的。
https://stackoverflow.com/questions/4705838
复制相似问题