PHP 位运算

位运算符允许对整型数中指定的位进行求值和操作。

例子 名称 结果
$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。

&运算符

$m = 1;
$n = 2;
$mn = $m & $n;
echo $mn;

运行结果为0

详解:把1,2转换为二进制

1 =>  00000001

2 => 00000010

按位与 的过程中,按位比较,全1为1,比较结果为00000000,所以输出0

|运算符

$m = 1;
$n = 2;
$mn = $m | $n;
echo $mn;

运行结果为3

将数字转换成二进制

1 =>  00000001

2 => 00000010

按位或 的过程中,有1为1,全0为0,则结果为00000011,所以输出3

^运算符

$m = 1;
$n = 2;
$mn = $m ^ $n;
echo $mn;

运行结果为3

转换成二进制

1 =>  00000001

2 => 00000010

按位亦或 的过程中,不同为1,相同为0,所以结果为00000011,进而输出3。

~运算符

$m = 2;
$m1 = ~$m;
echo $m1;

运行结果为-3

注:在计算机中,负数以其正值的补码形式表达。

1: 2的32位原码为 0000 0000 0000 0000 0000 0000 0000 0010

2: 按位取反后为  1111 1111 1111 1111 1111 1111 1111 1101

由于最前面的数为1,符号位为1,即为负数,所以,以其正值的补码形式表示为:(符号位不变,按位取反,末尾加1)

1000 0000 0000 0000 0000 0000 0000 0011

所以输出为-3

<<运算符

$m = 3;
$m1=$m << 1;
echo $m1;

运算结果为6

左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。

3的32位原码为,0000 0000 0000 0000 0000 0000 0000 0011

左移一位:0000 0000 0000 0000 0000 0000 0000 0110

所以为6

根据手册描述可以看出位运算可以看出向左移一位,则是实现乘2运算。由于位移操作的运算速度比乘法的 运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。 提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率。

>>运算符

右移一位,和<< 运算符,类似,只不过这个是右移,此处不在做过多解释。

参考 CSDN https://blog.csdn.net/qq_28602957/article/details/52141431

微信打赏微信打赏
支付宝打赏支付宝打赏

评论: