很多站长朋友们都不太清楚php右移运算符,今天小编就来给大家整理php右移运算符,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 php如何实现js的移位运算符 2、 PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜 3、 关于php 位运算符的问题 php如何实现js的移位运算符移位包括有符号左移(<<)、有符号右移(>>)、无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符号右移,此处实现一下。先看结果
将数字 $a 向右无符号移动 $n 位
[php] view plain copy
function uright($a, $n)
{
$c = 2147483647>>($n-1);
return $c($a>>$n);
}
下面是这样做的理由
1、有符号右移的过程
2 >> 1
2在计算机中存储的二进制表示为
000000000 00000000 00000000 00000010
向右移动1位,高位补0
000000000 00000000 00000000 00000001
结果为1
-2 >> 1
负数的存储是以补码的方式存储的(相关知识自行了解),这里简单说明
符号位是 1,-2的表示为
100000000 00000000 00000000 00000010
补码:除符号位外,其他位按位取反,然后 + 1
11111111 11111111 11111111 11111101
11111111 11111111 11111111 11111110
向右移动1位,高位补1
11111111 11111111 11111111 11111111
结果为 -1(转换成10进制后)
注意:移位操作是按照计算机中实际存储的二进制形式进行移动的
2、无符号右移的过程
2 >> 1同上
-2 >> 1
补码右移1位,高位补 0
01111111 11111111 11111111 11111111
结果是 2147483647
无符号右移 n 位,即把所有位向右移动 n 位(有符号右移),然后把前 n 位变成 0。
要把前 n 位变成 0 ,只需要让其跟一个前 n 位是 0,后 32-n 位是 1 的数进行按位与就可以了。
构造前 n 位是 0 后 32-n 位是 1 的数:利用正数有符号右移高位补 0 实现,这里用 2147483647 这个正数实现(当然其他数也可以),这个数在计算机中的存储前面已经说了,是
01111111 11111111 11111111 11111111
利用这个数构造前 n 位是 0 的数,只需将其向右移动 n-1 位就行了
-2 无符号右移 2位的过程
-2右移2位:11111111 11111111 11111111 11111111
构造数: 00111111 11111111 11111111 11111111
按位与: 00111111 11111111 11111111 111111
PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜"" 按位与运算
按位与运算符""是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
例如:95可写算式如下:
00001001 (9的二进制补码)
00000101 (5的二进制补码)
00000001 (1的二进制补码)
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a$b);
?>
"|" 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下:
00001001
|00000101
00001101 (十进制为13)可见9|5=13
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a|$b)."\n"; //二进制
echo sprintf("%d", $a|$b)."\n"; //十进制
"^" 按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:
00001001
^00000101
00001100 (十进制为12)
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a^$b)."\n"; //二进制
echo sprintf("%d", $a^$b)."\n"; //十进制
"~" 求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
例如~9的运算为:
~(0000000000001001)结果为:1111111111110110
<?php
$a = 9;
$b = 5;
echo sprintf("%b", ~$a)."\n"; //二进制
"〈〈" 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
a<<4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
<?php
$a = 3;
$temp = $a<<4;
echo sprintf("%d", $temp)."\n"; //十进制
“>>” 右移运算
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:
设 a=48,
a>>4
表示把00110000右移为00000011(十进制3)。
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
<?php
$a = 48;
$temp = $a>>4;
echo sprintf("%d", $temp)."\n"; //十进制
关于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位的,位移的结果就可能不一样了,要将计算时位的数量调整下。
关于php右移运算符的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php右移运算符 php 运算符的详细内容...