PHP位操作符

2014 年 2 月 26 日4030

这个涉及到系统底层,WEB开发中几乎没用到,知道下有这个东西就好了。底层的东西解释总是简单不了的。

变量在内存中的存放都是二进制数字。整数在32位系统上是占用4字节,一个字节是8位,也就是32位,位运算就是位级的运算操作了。



$a << $b Shift left(左移) 将 $a 中的位向左移动$b 次(每一次移动都表示“乘以 2”)。

假定变量

$a 的值是 3,$b 的值是 2。

那么 $a 在内存中的存放的格式是:

00000000 00000000 00000000 00000011

每执行一次左移,都将所有的位向左移动,右边补零,左边超过的舍弃。

所以 $a 左移 2 得到的是:

00000000 00000000 00000000 00011000

也就是 12。相当于 3 × 2 × 2 =12。


$a >> $b Shift right(右移) 将 $a 中的位向右移动$b 次(每一次移动都表示“除以 2”)。

假定变量 $a 的值是 24,$b 的值是 2。

那么 $a 在内存中的存放的格式是:

00000000 00000000 00000000 00011000

每执行一次右移,都将所有的位向由移动,右边超过的舍弃,左边空出的位补零。

所以 $a 右移 2 得到的是:

00000000 00000000 00000000 00000110

也就是 6。相当于 24 ÷ 2 ÷ 2 = 6。


位移运算是系统底层运算,运算的速度比乘除还要快很多,优化代码优化到极致的时候,可以将数换算成二的公倍数,然后进行位移计算。但在WEB开发中几乎没有任何必要,而且超过系统底层了,程序在的可移植性就会降低。


其他的位运算符也是差不多的。比如:

$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。

假定变量 $a 的值是 5,$b 的值是 6。

$a:

00000000 00000000 00000000 00000101

$b:

00000000 00000000 00000000 00000110

$a & $b :

00000000 00000000 00000000 00000101

00000000 00000000 00000000 00000110

───────────────────────────

00000000 00000000 00000000 00000100

竖的看,上下都是 1 的得到 1 ,否则就是 0。

所以 $a & $b = 4。


~ $a Not(按位非) 将 $a 中为 0 的位设为 1,反之亦然。

~ $a:

00000000 00000000 00000000 00000101

───────────────────────────

11111111 11111111 11111111 11111010

如果 $a 是有符号整数,第一位是符号位,1表示负数,那么 ~ $a = -2147483642。

如果 $a 是无符号整数,第一位还是数据位,那么 ~ $a = 4294967290。


以下的就不详细介绍了:

$a $b Or(按位或) 将把 $a 或者 $b 中为 1 的位设为 1。

$a ^ $b Xor(按位异或) 将把 $a 和 $b 中不同的位设为 1。


平常说的几位的系统,就是系统处理整数的时候,是多少个位同时计算的,上面的例子都是基于32位系统。因为移动时超过的位将被舍弃,如果是64位或12位的,位移的结果就可能不一样了,要将计算时位的数量调整下。


from:http://http://www.zjjv.com//.cn/s/blog_815611fb01017wtj.html

更多关于 的文章

·上一篇:PHPl使用DOM XML操作XML[总结]

·下一篇:已经没有了

0 0