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语言-结构体内存对齐
    Wireshark-配合tcpdump对Android(安卓)手机抓包
    Python-技巧
    矩阵白化
    非负矩阵分解(3):拉格朗日乘子法求解
    非负矩阵分解(2):算法推导与实现
    非负矩阵分解(1):准则函数及KL散度
    自适应滤波:递归最小二乘
    自适应滤波:最小二乘法
    自适应滤波:奇异值分解SVD
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/12221953.html
Copyright © 2011-2022 走看看