zoukankan      html  css  js  c++  java
  • 一篇文章搞懂移位运算

    前提知识:

    1. 计算机中对于有符号数的表示有三种方式,原码,补码,反码。

    2. 在Java中,二进制数最高位是符号位,0表示正数,1表示负数;

    3. 正数的表示,例如byte/int 数3,  二进制就是 0000 0011,负数的表示稍微麻烦一点(负数在计算机中是以补码的形式存储的)

      -5 的二进制: 

       1. -5的绝对值二进制表示  0000 0101

       2. 然后求这个数的反码  1111 1010

       3. 将反码加1 变成  1111 1011 , 这个就是-5的二进制表示(补码)

     

     移位运算:

    1. << 左移 (正负数一样)

      例如 5 << 2,  

       5 的二进制  0101 ,  5 << 2 变成 010100, 结果为 5 * 2 的 n次方 (n是移动位数)= 20 

      例如 -5 << 2,   

       -5 的二进制 1111 1011 ,  5 << 2 变成 1110 1100, 结果为 -5 * 2 的 n次方 (n是移动位数)= -20    

       说明,从负数二进制转成10进制, - 1 ,然后取反, 加上符号位。 1110 1100 -1 = 1110 1011, 取反 0001 0100 = 20, 加上符号位 -20

    代码:

    2. >> 右移 

       例如 int 32位  65 >> 2 ,

         65的二进制数 1000001 ,右移 补0 , 65 >> 2为 0010000, 65 / 2^n = 65 / 4 = 16.

         -65的二进制数据 10111111,右移补1, -65 >> 2 为 11101111 (-17) 

        负数-x的除法可以用以下方法来代替:

             (x + 2^N - 1) >> N    

         -65 右移二位为 65 + 2^2 - 1 >> 2 , 然后加上符号位。

        2.1 有一种情况,如果移动位数超过最大位数,例如int数超过32位,循环移位其实是一样的,用移动位数%32,就是移动位数。

        例如 65 移动34位,就是等同于移动2位(34 % 32 )

    3. >>> 逻辑右移

        例如 int -65 >>> 2

        65的二进制数 11111111111111111111111110111111, 

        逻辑右移2位   00111111111111111111111111101111    变成无符号正整数

        

    欢迎关注Java流水账公众号
  • 相关阅读:
    <转>c#调用C++DLL类型转换
    <转>CB2010使用一段时间总结。(Ansi>Unicode)
    Sql的自定义聚合函数,挺费劲。
    关于 MSDN 说 Lock 应该用private 对象锁定的测试。
    热门JQuery插件
    偶然发现 RouteDebuge 的作者是一个超牛的家伙。
    jquery.query 插件的设计问题。
    JQuery UI 调整笔记
    JQuery tr:visible IE8 失效.
    CS0016 一个解决方案:
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/12221953.html
Copyright © 2011-2022 走看看