A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© txl 中级黑马   /  2013-1-18 20:56  /  1912 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-19 16:12 编辑

毕老师在基础视频第二天中讲到了无符号右移,可是只是一点而过,请问无符号右移有什么意义呢!

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

4 个回复

倒序浏览
    无符号右移在数据变换时非常重要。比如对byte b;做无符号右移,在众多散列、加密、压缩、影音媒体编码、序列化格式都会用到。如果没有这个无符号右移,就需要用更大的空间去做有符号右移。比如byte就需哟short,short就需要int去做,浪费空间和时间。有符号位移都是指在无符号环境下成立。只因java没有无符号的基础类型,所以你理解成有符号下才是这样。总之,无符号右移的应用场合大大多于有符号右移。。
  无符号右移与带符号右移的区别就是 无符号始终补0。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
鲁柯 来自手机 高级黑马 2013-1-18 21:33:03
藤椅
无符号右移不管正负数左边空出来的位都补零  有符号右移在操作负数时可能达不到想要的效果  因为负数的二进制形式最高位是1,毕老师讲进制转换时的例子中 循环判断右移后的结果 是否为零 如果是负数用有符号方式右移的话  左边空位又会补0
这样的话就会陷入死循环 因为左边一直补1  就不可能移到结果为0

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
无符号右移就是不论什么情况向右移动数据后左端均补0.下面用一程序说明其应用。
我们用查表法将十进制的60转换为16进制时,其代码如下
class  IntegerToHex
{
        public static void main(String[] args)
        {
                toHex(60);
        }
        public static void toHex(int num)
        {
                char [] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
                char [] arr = new char[32];
                int pos = arr.length;
                while(num != 0)//内存中存储的二进制数据位0是结束循环
                {
                        int temp = num & 15;
                        arr[--pos] = chs[temp];
                        num = num >>> 4;//每次将内存中的二进制数据无符号右移4
                }
                for(int x = pos;x <arr.length;x++)
                        System.out.print(arr[x]);
               
        }
}

1.在内存中最初存储的十进制60的二进制的形式为:0000-0000 0000-0000 0000-0000 0011-1100,此时不为零执行右移4位操作一次;
2.当执行一次无符号右移4位后内存中的二进制形式为:0000-0000 0000-0000 0000-0000 0000-0011 最左边的4个0就是无符号右移四位后补的0,   此时还不为0,无符号右移4位(移出内存的1100通过查表知道对应得16进制数为 c);
3.当执行第二次无符号右移4位后内存中的二进制形式为:0000-0000 0000-0000 0000-0000 0000-0000 最左边的4个0就是第二次无符号右移四位后补的0(移出内存的0011通过查表知道对应得16进制数为 3);
4.通过第二次无符号右移后,此时数据已为0,不满足循环条件(num !=0)则结束循环打印十进制60对应的16进制数3c(本来打印的应该是 c3 但程序中的打印是逆序打印的就变成了3c,也就是十进制60对应的16进制数3c);

希望以上分析让你对无符号右移的理解有帮助,如果有不妥的地方请指正,大家彼此学习,一起进步!

评分

参与人数 1技术分 +1 黑马币 +9 收起 理由
Rancho_Gump + 1 + 9 赞一个!

查看全部评分

回复 使用道具 举报
无符号右移在数据变换时非常重要。比如对byte b;做无符号右移,在众多散列、加密、压缩、影音媒体编码、序列化格式都会用到。如果没有这个无符号右移,就需要用更大的空间去做有符号右移。比如byte就需哟short,short就需要int去做,浪费空间和时间。所谓“左移两位是乘以4(2的2次方),右移两位是除以4” 原先都是指在无符号环境下成立。只因java没有无符号的基础类型,所以你理解成有符号下才是这样。总之,无符号右移的应用场合大大多于有符号右移。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马