Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.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 - Fatal编程技术网

Php “|”字符是做什么的?

Php “|”字符是做什么的?,php,Php,可能重复: 为了找到答案,我在谷歌上搜索了很多,但什么也找不到。 我在一些免费源代码中看到他们使用|符号来组合值或其他东西。有人能解释一下|和+之间的区别吗 样本: <?php define('PERMISSION_DENIED', 0); define('PERMISSION_READ', 1); define('PERMISSION_ADD', 2); define('PERMISSION_UPDATE', 4); define('PERMISSION_DELETE', 8);

可能重复:

为了找到答案,我在谷歌上搜索了很多,但什么也找不到。 我在一些免费源代码中看到他们使用|符号来组合值或其他东西。有人能解释一下|和+之间的区别吗

样本:

<?php
define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);


$read_only = PERMISSION_READ;
$read_delete = PERMISSION_READ | PERMISSION_DELETE;
$full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE;


$myrights = PERMISSION_READ;
$myrights |= PERMISSION_UPDATE; 
?>
为什么不只是:

<?php
define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);


$read_only = PERMISSION_READ;
$read_delete = PERMISSION_READ + PERMISSION_DELETE;
$full_rights = PERMISSION_DENIED + PERMISSION_READ + PERMISSION_ADD + PERMISSION_UPDATE + PERMISSION_DELETE;


$myrights = PERMISSION_READ;
$myrights += PERMISSION_UPDATE; 
?>
|当输入中至少有一个对应位为1时,结果的每一位为1。使用加法也可以,但不能清楚地表明一个人正在组装位掩码,并且可能导致错误,因为

PERMISSION_READ + PERMISSION_READ != PERMISSION_READ
但是


它是按位or运算符,所以您使用的是以2为基数的数字表示法

例如:

$user_perms = perm1 | perm3;
if ($user_perms & perm4) echo "user does not have this permission";
1000 | 0001=1001==>8 | 1=9

在您的代码中,每个权限由位于不同位置的一位表示,我的意思是:

1=0001=perm1 2=0010=perm2 4=0100=3 8=1000=4

这样做或使用这些数字将为您提供包含所有权限的数字。然后,如果要检查是否设置了权限,则必须使用正在检查的权限执行and操作,例如:

$user_perms = perm1 | perm3;
if ($user_perms & perm4) echo "user does not have this permission";

这是一个按位OR运算符

您可以在此处找到有关它的更多信息:


按位运算符通常适用于软加密方法

好的,有一点不同。要查看差异,您只需查看这些数字在二进制中的显示方式:

0 =  00000000
1 =  00000001
2 =  00000010
4 =  00000100
8 =  00001000
正如您所看到的,这些数字中的每一个都只有一个位设置为1,每个位位于不同的位置

现在,在它们之间有一个按位OR将使每个位置上有一个作为操作数的结果:

00000010 |
00000100
----------
00000110
在这种情况下,这与添加数字是一样的

0 | 0 = 0; 0 + 0 = 0
0 | 1 = 1 | 0 = 1 + 0 = 1
不同之处在于:

1 | 1 = 1

1 + 1 = 10 !!

本例中的不同之处在于,位运算符更快,因为您只需对位进行操作

术语“逻辑或”适用于单个二进制数字。按位是指完整的二进制值。这里没有二进制数,只有一个数字的二进制表示法,它只是以2为基数的表示法。将符号和概念混为一谈,虽然对初学者很有吸引力,但imho阻止程序员充分理解手头的概念。你是对的,请注意,这里不是每个人都说母语英语,而且解释可能重复的内容并不容易-参见