分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

PHP实现无符号右移(js中的 >>>)

发布时间:2023-09-06 02:23责任编辑:沈小雨关键词:jsPHP
移位包括有符号左移(<<)、有符号右移(>>)、无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符号右移,此处实现一下。先看结果
将数字 $a 向右无符号移动 $n 位

下面是这样做的理由
1、有符号右移的过程

2 >> 12在计算机中存储的二进制表示为000000000 ?00000000 ?00000000 ?00000010向右移动1位,高位补0000000000 ?00000000 ?00000000 ?00000001结果为1-2 >> 1负数的存储是以补码的方式存储的(相关知识自行了解),这里简单说明符号位是 1,-2的表示为100000000 ?00000000 ?00000000 ?00000010补码:除符号位外,其他位按位取反,然后 + 111111111 ?11111111 ?11111111 ?1111110111111111 ?11111111 ?11111111 ?11111110向右移动1位,高位补111111111 ?11111111 ?11111111 ?11111111结果为 -1(转换成10进制后)注意:移位操作是按照计算机中实际存储的二进制形式进行移动的

2、无符号右移的过程

2 >> 1同上-2 >> 1补码右移1位,高位补 001111111  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

其他了解:

https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin

转: https://blog.csdn.net/u010320108/article/details/77967711

PHP实现无符号右移(js中的 >>>)

原文地址:https://www.cnblogs.com/fps2tao/p/9982283.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved