PHP实现无符号右移(js中的 >>>)
来源:互联网 发布:怎么创建自己软件 编辑:程序博客网 时间:2024/06/15 15:25
移位包括有符号左移(<<)、有符号右移(>>)、无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符号右移,此处实现一下。先看结果
将数字 $a 向右无符号移动 $n 位
function uright($a, $n){ $c = 2147483647>>($n-1); return $c&($a>>$n);}
下面是这样做的理由
1、有符号右移的过程
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
阅读全文
0 0
- PHP实现无符号右移(js中的 >>>)
- C++中实现无符号右移
- C++中实现无符号右移
- C++中实现无符号右移
- PHP中 应该如何写 无符号右移
- java 无符号右移
- 使用无符号右移-&-栈 实现 十进制转十六进制
- 有符号右移,无符号右移,左移
- 无符号右移运算符 (>>>)
- java的无符号右移
- <<(左移) 、>>(右移) 和 >>>(无符号右移)
- 移位(左移,右移和无符号右移)
- java左移、右移、无符号右移
- java左移、右移、无符号右移、补码
- 无符号右移,左移,右移操作
- java左移、右移、无符号右移
- 运算符 左移<<, 右移>>, 无符号右移>>>
- Java中“>> 右移”;“<< 左移”无符号右移>>>;“
- 丑数
- 【LeetCode】234、Palindrome Linked List
- 156:LETTERS(2.5基本算法之搜索)
- 在JAVA中如何跳出当前的多重嵌套循环?
- 排序算法总结
- PHP实现无符号右移(js中的 >>>)
- iOS开发之归档(NSKeyedArchiver)和反归档(NSKeyedUnarchiver)
- C++容器array
- Python 常用工具函数
- 临时对象的产生与运用
- UVA
- Windows环境使用Cygwin安装Hadoop(亲测可用)
- java集合
- 源代码安装apache服务器