<?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
8条答案
按热度按时间628mspwn1#
按位对PHP中的东西很有用,就像其他任何东西一样。
如果一个值可以同时打开多个状态呢?
输出:
jrcvhitl2#
忘记你脑子里的想法
好,现在假设你有几个不同的角色:admin、user、guest。
和一些不同的权限:读、写和删除
让我们为权限和角色创建一些位掩码。位掩码是可用于操作或读取某种标志的位序列。如下图所示:
注意1、2、4。必须将其提高一倍。否则,它可能会给予你一些尴尬的结果。
忘记评论的东西。这些只是用于各个权限和角色的位序列(或位掩码)。
现在让我们创建一个方便的函数,可以用来检查特定角色的特定权限。
我们结束了让我们检查所有3个角色的**$delete**权限:
为什么是bitwise operation?总之,按位运算速度更快,更简洁,更易维护。否则,对于复杂的应用程序,使用按位操作总是有效的。
ubof19bj3#
按位
|
和&
以及逻辑||
和&&
* 完全不同 *。按位运算符对两个数字的 * 位 * 执行运算并返回结果。这意味着这不是一个是或否的事情。如果它们被用在条件语句中,它们通常被用作逻辑比较的一部分。举例来说:
逻辑运算符比较两个(或多个)条件/表达式并返回true或false。它们最常用于条件语句,如
if
和while
。举例来说:yzckvree4#
按位运算符专门用于二进制值表示的情况。
逻辑运算符最适合用于比较,并且在
AND
和XOR
操作的情况下比按位运算符快一点。如果
func1()
返回false,则不会调用func2()
将调用这两个函数而不管它们的返回值。
zfycwa2u5#
在大多数情况下,您可能需要使用逻辑运算符。它们用于组合逻辑条件,通常用于控制程序流,例如。
($isAlive && $wantsToEat)
。当您希望对整数的基础二进制表示形式逐位执行操作时,可以使用按位运算符。例如
(5 & 3) == 7
。正如其他人所建议的那样,在倾向于用PHP编写的应用程序中,通常没有太多的需求(尽管在低级语言中有,如C)。yzckvree6#
按位运算符在处理数字的位时很有用。你看。否则,您应该使用逻辑运算符。逻辑运算符也被短路。例如,如果您有
a && b
,而a
是false
,则不计算b
。免责声明:我来自Java背景,但我猜在PHP中也是一样的。
30byixjq7#
他们是两个非常不同的运营商。
当你想让两个条件同时为真时,你可以使用逻辑
&&
。例如,我只想在某人的生日是今天的情况下打印出“Happy birthday”&&他们的账户里有钱。当我们想要执行两个或多个条件的组合时,通常在if语句和循环条件中使用(尽管不是唯一的)。当你想执行按位操作时(这在日常的PHP编程中是非常罕见的),你可以使用按位
&
。这种情况要少见得多,而且你可能会执行按位掩码(虽然我对此表示怀疑),所以你可能只想要一个两个整数都表示的结果,在这种情况下,你可以说newAttribute = attribute1 & attribute2;
。5f0d552i8#
好吧,假设有
$x = (false && some_function());
,这里$x
的值将被设置而不调用some_function()
,因为第一个值是x1。但是如果你无论如何都需要调用这个函数呢?使用
$x = (false & some_function());
。换句话说,
&
比&&使用更多的处理,只是因为&&没有遍历所有的值来检查它们。如果它发现一个值为false,它将返回它,而不查看其他值。在逻辑运算中,使用
&&
运算符,因为它用于返回逻辑运算值,其中&
用于 * 设置 * 一个值,并且在if
语句中,它将始终返回true。