码迷,mamicode.com
首页 > 其他好文 > 详细

一篇文章搞懂移位运算

时间:2020-01-21 16:07:40      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:一点   说明   有符号   nbsp   原码   符号   取反   循环移位   ima   

前提知识:

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

    技术图片

一篇文章搞懂移位运算

标签:一点   说明   有符号   nbsp   原码   符号   取反   循环移位   ima   

原文地址:https://www.cnblogs.com/zhengwangzw/p/12221953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!