Php 位掩码-如何设置不同的选项?

Php 位掩码-如何设置不同的选项?,php,bit-manipulation,Php,Bit Manipulation,我使用位掩码访问应用程序,并且我有一个数组: $arr['view_info'] = 2; $arr['view_terminals'] = 4; $arr['view_payments'] = 6; $arr['view_subdealers'] = 8; $arr['view_providers'] = 10; $arr['view_users'] = 12; $arr['view_reports'] = 14; 因此,问题是-我如何添加权限,例如-查看_终端和

我使用位掩码访问应用程序,并且我有一个数组:

  $arr['view_info'] = 2;
  $arr['view_terminals'] = 4;
  $arr['view_payments'] = 6;
  $arr['view_subdealers'] = 8;
  $arr['view_providers'] = 10;
  $arr['view_users'] = 12;
  $arr['view_reports'] = 14;
因此,问题是-我如何添加权限,例如-查看_终端和查看_报告,而不允许访问4到14之间的OPT


只是最后一个问题-如何添加8个以上的权限,因为我知道二进制sys中的最大值为255-所以最后一个是128?我听说过组。

为了使用位掩码,需要将数组的值设为2的幂。(见)

就你而言:

$arr['view_info'] = 1;            // 0000000001
$arr['view_terminals'] = 2;       // 0000000010
$arr['view_payments'] = 4;        // 0000000100
$arr['view_subdealers'] = 8;      // 0000001000
$arr['view_providers'] = 16;      // 0000010000 
$arr['view_users'] = 32;          // 0000100000
$arr['view_reports'] = 64;        // 0001000000

并将用户的用户权限设置为2+64(
00010000010

为了使用位掩码,您需要将数组的值设置为2的幂。(见)

就你而言:

$arr['view_info'] = 1;            // 0000000001
$arr['view_terminals'] = 2;       // 0000000010
$arr['view_payments'] = 4;        // 0000000100
$arr['view_subdealers'] = 8;      // 0000001000
$arr['view_providers'] = 16;      // 0000010000 
$arr['view_users'] = 32;          // 0000100000
$arr['view_reports'] = 64;        // 0001000000

并为您的用户将用户权限设置为2+64(
00010000010

,这些值很难做到。您的位掩码值应为2的幂,即1、2、4、8、16、32、64、128、256等。然后您可以使用这些非常难以执行的值执行
$arr['view_terminals'].\124;$arr['view_reports']

。您的位掩码值应为2的幂,即1、2、4、8、16、32、64、128、256等。然后您可以执行
$arr['view_terminals'].\124;$arr['view_reports']

在处理按位操作时,添加内容是违反直觉的。你最好使用|,&,~,等等。换句话说,在真实的应用程序中:$userPerms=$arr['view_terminals']|$arr['view_reports']/00010000010感谢LOTA使用逐位操作时,加法是违反直觉的。你最好使用|,&,~,等等。换句话说,在真实的应用程序中:$userPerms=$arr['view_terminals']|$arr['view_reports']/00010000010谢谢洛蒂接受你的回答,因为-我喜欢练习有用的建议,再次感谢。最后一个问题-如何添加8个以上的权限,因为我知道二进制系统中最大值为255-所以最后一个是128?不,在(有符号)32位整数中,你可以在(有符号)64位整数63中使用31个唯一位(最多2147483647)(9.223372036854776e+18)。例如:@deceze,为什么只有31(和63)?最后一个(或第一个)有什么问题bit?@binary第一位表示有符号整数中的值是正数还是负数。在无符号整数中,您可以使用所有位,但不能表示负值。PHP没有无符号整数。我接受您的回答,因为-我喜欢实践有用的建议,再次感谢。最后一个问题-如何添加8个以上的权限,正如我所说的知道二进制系统中的最大值是255吗?所以最后一个是128?不,在(有符号)32位整数中,可以使用31个唯一位(最多2147483647),在(有符号)64位整数63中(9.223372036854776e+18)。例如:@deceze,为什么只有31(和63)?最后一个(或第一个)有什么问题bit?@binary第一位表示有符号整数中的值是正数还是负数。在无符号整数中,可以使用所有位,但不能表示负值。PHP没有无符号整数。您可以在32位整数中设置为32位。无符号32位整数的范围是
0..4294967295
,但我不这么认为可以设置4294967295个不同的位。这只意味着可能有4294967296个“组合”位值。例如,65165将是
0000 0000 0000 1111 1110 1000 1101
,设置11位,未设置21位。如果您有32位系统,那么您可以使用32位整数,即在单个整数中存储32位。要存储128位,您应该使用4位整数。感谢大家,我非常感谢您的关注32位整数中最多32位。无符号32位整数的范围为
0..4294967295
,但这并不意味着您可以设置4294967295个不同的位。这只是意味着您可能有4294967296个“组合”位值。例如,65165将是
0000 0000 0000 0000 1111 1110 1000 1101
,设置11位,取消设置21位。如果您有32位系统,那么您可以使用32位整数,即在单个整数中存储32位。要存储128位,您应该使用4位整数。感谢大家,我非常感谢你们的关注