我是靠谱客的博主 纯情咖啡豆,最近开发中收集的这篇文章主要介绍PHP实现无符号右移(js中的 >>>),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

移位包括有符号左移(<<)、有符号右移(>>)、无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符号右移,此处实现一下。先看结果
将数字 $a 向右无符号移动 $n 位
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  11111111

最后

以上就是纯情咖啡豆为你收集整理的PHP实现无符号右移(js中的 >>>)的全部内容,希望文章能够帮你解决PHP实现无符号右移(js中的 >>>)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部