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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝亚平 黑马帝   /  2011-12-2 12:09  /  10877 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不用再试了,乃要相信自己
回复 使用道具 举报
本帖最后由 郝亚平 于 2011-12-2 14:25 编辑

>>按位右移:本质就是除法/
6>>3就是6/(2的3此方),结果就是0  
6>>2就是6/(2的2此方),结果就是1
正数右移特征,移动位数越多,越小。

<<按位左移:本质就是乘法*
6<<3就是6*(2的3次方),结果就是48
6<<2就是6*(2的2次方),结果就是24
正数左移特征,移动位数越多,越大。

这个是针对于正数的情况,那么,如果对于负数类?有没有类似的规律?
自己试了试:

测试负数右移--
-6>>3=-1
-6>>2=-2
结论:
负数右移特征,移动位数越多,越大。
不符合除以2的移动位数次幂规律。

测试负数左移--
-6<<3=-48
-6<<2=-24
结论:
负数左移特征,移动位数越多,越小。
符合乘以2的移动位数次幂规律。

问:
按位右移,本质是除法,这点是否对于负数的情况不适用呀?谢。














评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

倒序浏览
李晓斌 发表于 2011-12-2 12:22
不用再试了,乃要相信自己

好。相信自己。:P
回复 使用道具 举报
同学好,您有没有算错啊?我怎么算的结果是您的负数右移出错了呀,-6>>3=-1和 -6>>2=-2这两个值不对吧?我算来算去都是-6>>3=0,-6>>2=-1啊?按我算的来的话,就是仍然符合这个规律的呀,毕老师的视频第2天13课有讲到,刚刚重新学习了下。先吃饭去了
回复 使用道具 举报
本帖最后由 郝亚平 于 2011-12-2 13:49 编辑
李栋 发表于 2011-12-2 12:41
同学好,您有没有算错啊?我怎么算的结果是您的负数右移出错了呀,-6>>3=-1和 -6>>2=-2这两个值不对吧?我 ...


这个我写的程序。
class Test{
        public static void main(String args[]){
                System.out.println((-6)>>3);//这个输出是-1
                System.out.println(-6>>2);//这个输出是-2
        }
}

就是呀,没有错呀。你试试?
如果还不信,不妨用最基本的思路来走一遍。如下:
以(-6)>>3为例子。
首先:
6的二进制形式:
0000-0000 0000-0000 0000-0000 0000-0110
下面取反:
1111-1111 1111-1111 1111-1111 1111-1001
再加1:
1111-1111 1111-1111 1111-1111 1111-1010(就得到了-6的二进制形式啦)

下面开始对-6进行右移3位,高位就空出来了3位,根据高位是1,高位应该补充3个1,就得到:
1111-1111 1111-1111 1111-1111 1111-1111(也就是全部是1)

再把这个结果转换成十进制。
肯定是-1。
转换方法,你可以依据:
       负数的二进制,求其对应的十进制,步骤:
       1.求负数二进制的反码。(就是取反,肯定变成了一个正数)
       2.求这个反码对应十进制的相反数。(反码是正数,很好求十进制,在这个十进制正数前面加上负号,变成负数了)
       3.用这个相反数-1就是结果了。(再用这个负数减去1就得到这个负数二进制的十进制数据了。)

你也可以用计算器转换一下子就知道了。应该就是-1吧。
还可以用Java验证一下子:
        打印:
           System.out.println(Integer.toBinaryString(-1));//11111111111111111111111111111111

不知道上面分析有错误吗??
















点评

确实是我错了,感谢楼主帮助我纠正错误,谢谢您  发表于 2011-12-2 16:32

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
李栋 发表于 2011-12-2 12:41
同学好,您有没有算错啊?我怎么算的结果是您的负数右移出错了呀,-6>>3=-1和 -6>>2=-2这两个值不对吧?我 ...

  1.                 //[个人意见] 好像是你错了吧,呵呵,至于lz的规律,就不费心去研究了,头疼
  2.                 public static void main(String[] args)
  3.         {
  4.                 System.out.println(-6>>1); //=-3
  5.                 System.out.println(-6>>2); //=-2
  6.                 System.out.println(-6>>3); //=-1
  7.                
  8.                 //-6  的原码:1000 0110
  9.                 //      反码:1111 1001(原码取反,注:不包括符号位)
  10.                 //      补码:1111 1010(反码+1)
  11.                                                                                                
  12.                 // >>1,右移1位(高位由符号位补):                  
  13.                 //      移位:1111 1101(这是补码)               
  14.                 //      取反:1000 0010(注:不包括符号位)
  15.                 //      +1  :1000 0011(这是原码)                    
  16.                 //      即为:-3   
  17.                
  18.                 // >>2,右移2位:
  19.                 //      移位:1111 1110  
  20.                 //      取反:1000 0001         
  21.                 //      +1  :1000 0010                    
  22.                 //      即为:-2
  23.                
  24.                 // >>3,右移3位:
  25.                 //      移位:1111 1111  
  26.                 //      取反:1000 0000         
  27.                 //      +1  :1000 0001                    
  28.                 //      即为:-1
  29.         }
复制代码
回复 使用道具 举报
张海兵 黑马帝 2011-12-2 14:05:01
7#
-6>>3数字很大,因为左边空位补0,一般负数右移选择>>>,前面会补0.
回复 使用道具 举报
李栋 金牌黑马 2011-12-2 16:27:41
8#
对不起,是我算错了。感谢大家帮助纠正,确实是我错了,因为我仅仅去反了却忘记了+1。我现在在补之前的课,发现自己听过的基础还很差很不牢固,谢谢大家{:soso_e106:}

评分

参与人数 1技术分 +1 收起 理由
admin + 1 继续努力!

查看全部评分

回复 使用道具 举报
李栋 金牌黑马 2011-12-2 16:31:06
9#
是取反,打错字了,唉,还是太粗心,记性也差{:soso_e106:}
回复 使用道具 举报
monghuan 发表于 2011-12-2 13:57

确实是我错了,感谢monghuan同学帮助纠正,谢谢您
回复 使用道具 举报
哦,我还有个问题,刚刚算了下,上面的右移解决了,可是那个左移······到底是补0还是补1啊?因为毕老师视频没有讲到这个地方,所以不太理解,希望大家帮助{:soso_e121:}
回复 使用道具 举报
李栋 发表于 2011-12-2 16:50
哦,我还有个问题,刚刚算了下,上面的右移解决了,可是那个左移······到底是补0还是补1啊?因为毕老 ...

<<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
  1. System.out.println(-6<<1); //=-12
  2.                 System.out.println(-6<<2); //=-24
  3.                 System.out.println(-6<<3); //=-48
  4.                 //-6  的原码:1000 0110
  5.                 //        反码:1111 1001(原码取反,注:不包括符号位)
  6.                 //        补码:1111 1010(反码+1)                                                                               
  7.                 // <<1,右移1位(低位补0):                  
  8.                 //      移位:1111 0100(这是补码)               
  9.                 //      取反:1000 1011(注:不包括符号位)
  10.                 //      +1  :1000 1100(这是原码)                    
  11.                 //      即为:-12   
  12.                
  13.                 // <<2,右移2位(低位补0):                  
  14.                 //      移位:1110 1000               
  15.                 //      取反:1001 0111
  16.                 //      +1  :1001 1000                  
  17.                 //      即为:-24  
  18.                
  19.                 // <<1,右移1位(低位补0):                  
  20.                 //      移位:1101 0000            
  21.                 //      取反:1010 1111
  22.                 //      +1  :1011 0000                    
  23.                 //      即为:-48  
复制代码

点评

谢谢您,这个问题刚刚已经在其他帖子上解决啦,monghuan同学,您里面的左右移符号错了,呵呵,谢谢您啦  发表于 2011-12-2 18:26

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
monghuan 发表于 2011-12-2 18:20

是“右移”忘改了成“左移”了,(复制的副作用)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马