PHP中的位运算?

28

我了解位运算在很多低级编程方面是必需的,比如编写设备驱动程序、低级图形、通信协议包装和解码等。我已经做PHP几年了,但在PHP项目中很少见到位运算。

您能给我举例使用吗?


在 PHP 中,很少使用位运算符,除了优化技巧和配置之外,如 http://php.net/manual/en/function.error-reporting.php。 - Ignacio Vazquez-Abrams
请查看以下链接以获取更多详细信息: http://www.phpchef.com/posts/php-bitwise-operators - Abutouq
2个回答

46

你可以用它来编码事物的组合,比如位掩码。基本上,它通过赋予每个比特一种含义来工作,因此如果你有一个 00000000 ,每个比特都代表着一些东西,并且也是���个十进制数。比如说我有一些用户偏好需要存储,但我的数据库在存储方面非常有限。我可以简单地存储这个十进制数,并从中推导出哪些偏好被选择了,例如 9 就是 2^3 + 2^0 ,它的二进制表示是 00001001,所以该用户偏好1和偏好4。

 00000000 Meaning       Bin Dec    | Examples
 │││││││└ Preference 1  2^0   1    | Pref 1+2   is Dec   3 is 00000011
 ││││││└─ Preference 2  2^1   2    | Pref 1+8   is Dec 129 is 10000001
 │││││└── Preference 3  2^2   4    | Pref 3,4+6 is Dec  44 is 00101100
 ││││└─── Preference 4  2^3   8    | all Prefs  is Dec 255 is 11111111
 │││└──── Preference 5  2^4  16    |
 ││└───── Preference 6  2^5  32    | etc ...
 │└────── Preference 7  2^6  64    |
 └─────── Preference 8  2^7 128    |

更多阅读


1
如果要处理一个假设的大/可变数量的偏好,这个规模会有多好? - Elzo Valugi
你的意思是速度方面还是可能的偏好数量?在32位操作系统上,单个位掩码的最大偏好数为31。但可以通过数组组合多个位掩码。请参见http://php.net/manual/en/language.operators.bitwise.php上的注释。 - Gordon
1
把一个好的API封装起来,调试就容易多了。我可以想象位掩码比数组要快,但我从未对它们进行过基准测试。我很少使用位掩码。你只是在寻找位运算的例子,而位掩码就是其中之一 :) - Gordon
3
@Elzo 你说得非常正确,使用混合的布尔值比使用明确的取值为 true 或 false 的布尔值更难调试/维护,并且实际上可能会更慢。通常最好为 API 显式命名布尔值,在存储这些值时也是如此。它只适用于少数情况。例如,如果您有一个特定的已知要求,需要在存储空间占用方面非常高效(例如嵌入式系统),或者(一种更近期的范例)您想将许多选项编码为 URL 参数,同时保持 URL 短小。 - Iain Collins
这是我见过的最好的例子之一,非常感谢。我正在尝试使用位 https://dev59.com/02435IYBdhLWcg3wfgMf - JasonDavis
显示剩余2条评论

18

位运算在凭证信息中非常有用。例如:

function is_moderator($credentials)
{ return $credentials & 4; }

function is_admin($credentials)
{ return $credentials & 8; }

这样,我们可以将所有凭据保存在系统中的一个简单整数数据库列中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接