一篇文章搞懂移位运算

Posted zhengwangzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章搞懂移位运算相关的知识,希望对你有一定的参考价值。

前提知识:

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    变成无符号正整数

    技术图片

以上是关于一篇文章搞懂移位运算的主要内容,如果未能解决你的问题,请参考以下文章

(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)

计算机组成原理——移位运算

计算机组成原理——移位运算

移位运算符的效果

移位运算符的效果

java 移位运算