黑马程序员技术交流社区

标题: [已解决@2014-02-27]关于[负数]做[移位运算]的问题 [打印本页]

作者: Diferay    时间: 2014-2-23 21:19
标题: [已解决@2014-02-27]关于[负数]做[移位运算]的问题
本帖最后由 Diferay 于 2014-2-27 00:39 编辑

关于[负数]做[移位运算]的问题


题目:   ( byte类型) -3>>2


步骤:   a. 3的二进制                          0000-0011

           b. 取反加1得到-3的二进制    1111-1101

           c. -3>>2 向右移两位得到      1111-1111  也就是 -1



结论:   -3>>2  =  -1



问题 :   -3>>2 相当于除以2的2次幂 -3/(2*2) = 0 与结论冲突


所以 :   -3>>2 到底要怎么算呢  结果是 -1 还是 0?


作者: elq7xy    时间: 2014-2-23 22:39
本帖最后由 elq7xy 于 2014-2-23 22:47 编辑

00000011是3,-3的原码为10000011,-3的反码为11111100,-3的补码为11111101,向右位移2位变为11111111,补码变反码11111110,反码变原码
10000001,为-1.-3/3(2*2)=-1

作者: Diferay    时间: 2014-2-23 23:39
elq7xy 发表于 2014-2-23 22:39
00000011是3,-3的原码为10000011,-3的反码为11111100,-3的补码为11111101,向右位移2位变为11111111,补 ...

前面两行 我也推出来了  得出结果是 -1,
然后不是说 >>n 就是除以 2的n次幂吗?
请问你回答的最后一行是什么意思呀,
"-3/3(2*2)=-1 "
为什么出来个 -3 / 3 ?
作者: 谭荣强    时间: 2014-2-26 00:20
-3/(2*2) = 0 与结论冲突 这一块你搞错了, -3/2*2=-0.75,不是约等于0,而是约等于-1.初中问题,我开始也蒙了
作者: 谭荣强    时间: 2014-2-26 01:32
-3/2*2在java中取整是0,但是在数学上是-1, 主要看一种语言的定义规则怎么定义。
作者: Silvester    时间: 2014-2-27 00:38
本帖最后由 Silvester 于 2014-2-27 00:52 编辑

刚看到问题我有个猜想,会不会 /运算时计算机执行的是逻辑移位(即>>>),而>>是算术移位,但查阅资料也没权威的说法,暂时放一边,请楼主看以下程序:
1. 编程测试:System.out.println(-3 >> 2);  
                     System.out.println(-3 >>> 2);  
输出结果为:-1
                    1073741823
2.  编程测试:System.out.println(-3/(2*2));              
输出结果为:0
3. 编程测试:byte a = -3;
                     byte b;
                     b = a/(2*2);
                     System.out.println(b);
编译未通过,报错:
                             错误:可能损失精度
                             b =a/(2*2);
                             需要:byte
                             找到:int
在2中的除法运算-3/(2*2)均为int类型,把a, b定义为byte以后或损失精度
4. 编程测试:byte a = -3;
                     byte b;
                     b =(byte)(a/(2*2));
                     System.out.println(b);
输出结果:0
(4)的结果和(2)的结果结果相等,感觉好像问题出在类型定义上,不过具体的原理没理顺,就暂时能回答到这,正在思考中,希望有人能解惑。

作者: 谭荣强    时间: 2014-3-2 21:58
Silvester 发表于 2014-2-27 00:38
刚看到问题我有个猜想,会不会 /运算时计算机执行的是逻辑移位(即>>>),而>>是算术移位,但查阅资料也没 ...

今天在J<ava核心技术 第八版 卷Ⅰ(基础篇)>这本电子书上看到,int取整的方式是将小数点部分去掉。-1.7=-1了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2