关于php 位运算符的问题

请高手详细的,简单明了的解释一下php中位运算符是怎么工作的,看书实在不明白什么意思。

这个涉及到系统底层,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位的,位移的结果就可能不一样了,要将计算时位的数量调整下。

参考资料:http://www.php.net/manual/zh/language.operators.bitwise.php

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-19
其他语言中有的+就是连接的意思,但是在php中+就是加法运算的意思。连接两个字符的符号是“. ”。举个例子
假如$str=20;
$arr[$i]=50;
$str.=$arr[$i];翻译一下就应该是$str=20;连接上$arr[$i]=50;并且把新的字符串的值赋给变量$str。如果这个不明白的话,就换个说法,就是$str.=$arr[$i];翻译出来就是$str=$str连接$arr[$i];等号后面的内容“$str连接$arr[$i]”的值付给了$str;也就是$str=20连接50;也就是$str=2050;
如果是$str+=$arr[$i]的话,和上面的一样,只是把连接换成了加法。
不知道你id前面的?是写错了还是什么意思。那个++++的应该没什么意思,就是一串字符串,不用当成自增也就是“++”处理。因为那一串++和i都是在‘’当中的。如果是$str++的话,就应该是20+1了。

关于php 位运算符的问题
位移运算是系统底层运算,运算的速度比乘除还要快很多,优化代码优化到极致的时候,可以将数换算成二的公倍数,然后进行位移计算。但在WEB开发中几乎没有任何必要,而且超过系统底层了,程序在的可移植性就会降低。其他的位运算符也是差不多的。比如:a & $b And(按位与) 将把 $a 和 $b 中都为...

PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈、〉〉这些符号我一个也...
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如:a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。<?php a = 3;temp = $a<<4;echo spri...

php位运算中为什么 'a'&1=0,而不是1,a的ascii码对应值是97,那不就是...
both operands will be converted to integers and the result will be an integer.使用 &, | 还有 ^ 操作符的时候,只有操作符两边的值都是 string 的时候,才会使用 ASCII 去运算,返回 string,其他的所有情况下,都会把值转换成 int。你问题中的运算并非两个值都是字符串,所以都要被转成 int...

在php中1>>0是什么意思?~
>>和<<是位移操作运算符,其功能是把左边的数据向右、向左移动指定的位数,例如:7>>1的结果是3 因为7的二进制是0000 0111,向右移动一位时,左边用最高位填充、右边的丢弃,向右移动后的结果为0000 0011,也就是10进制的3 向左移动、移动多位的计算方法同上面的例子 你可以去后盾人平台看看,里...

PHP中使用按位取反(~)函数创建后门
在PHP中,按位取反(~)运算符能够将一个整数的二进制位进行反转。如果原数的某位是0,则该位变为1,反之亦然。这个特性在某些场景下可以用来绕过安全机制,创建后门。例如,通过将按位取反运算应用于错误报告的配置,可以实现特定错误的隐藏。在php.ini文件中,可以通过设置`error_reporting = E_ALL...

PHP 按位取反 运算符(~) 到底怎么算出来的? $a = 8 $b = ~$a echo...
1000 取反后 28个1 0111 第一位是符号位 1代表负数,剩下的27个1 0111 负数是用补码表示的,补码是原码取反+1,也就是说 27个1 0111 是某个数的补码,那倒推回去,这个数就是补码-1后取反,也就是 27个1 0110取反,得到27个0 1001,也就是9,再加上前面的符号位,得到-9 ...

(1\/2)PHP的位运算是怎么算出来的?也就是说通过转换成二进制后结果是怎么...
位与 如两个数值有某共同比特位为1,则返回值的对应位也为1,否则为0。

在php中1>>0是什么意思?
>>和<<是位移操作运算符,其功能是把左边的数据向右、向左移动指定的位数,例如:7>>1的结果是3 因为7的二进制是0000 0111,向右移动一位时,左边用最高位填充、右边的丢弃,向右移动后的结果为0000 0011,也就是10进制的3 向左移动、移动多位的计算方法同上面的例子 ...

在PHP中【逻辑运算符】和【位运算符】有什么本质的区别?
二、位运算符:包括:1。&位与符 2。|位或符 3。^位异或符 4。~位取反符 以操作数12为例。位运算符将数字12视为1100。位运算符将操作数视为位而不是数值。数值 可以是任意进制的:十进制、八进制或十六进制。位运算符则将操作数转化为二进制,并相应地返回1或0。位运算符将数字视为二进制...

PHP8的运算符-PHP8知识详解
PHP8提供了丰富的运算符,包括算术运算符如加、减、乘、除、取模和幂,赋值运算符如算术赋值和位赋值,以及逻辑运算符、字符串运算符、数组运算符等。位运算符如按位与(&)、按位或(|)和按位异或(^)等,用于操作二进制位。比较运算符如等于(==)、全等(===)、不等于(!=)和不全等(!==)等...

相似回答