zoukankan      html  css  js  c++  java
  • 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 位是 032-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

  • 相关阅读:
    IE盒子模型和标准W3C盒子模型
    [转载] MVC3自定义标签,给Html.ActionLink加上支持图片链接的功能
    MVC3获取登录用户名
    [转]APS.netMVC的ViewModel问题
    [转载]Js小技巧||给input type=“password”的输入框赋默认值
    [资料]aspnetdb.mdf数据库的建立和使用
    [转] .net网页中插入Flash
    [转]Membership、MembershipUser和Roles类
    [小技巧]提交按钮
    asp.net mvc中session的使用 样例
  • 原文地址:https://www.cnblogs.com/fps2tao/p/9982283.html
Copyright © 2011-2022 走看看