黑马程序员技术交流社区

标题: 自己找的小练习可是看了半天也不明白 [打印本页]

作者: 马林康    时间: 2012-6-20 03:15
标题: 自己找的小练习可是看了半天也不明白
本帖最后由 马林康 于 2012-6-20 09:16 编辑
  1. public class OperatorDemo2 {
  2.         public static void main(String[] args){
  3.                 int num =32;
  4.                 System.out.println(num>>=32);
  5.         }

  6. }
复制代码
问,上述代码输出什么?我运行了一下输出32 请问这个32是怎么来的? 32右移32位结果不是0吗?

作者: 陆强强    时间: 2012-6-20 07:28
这是两次运算,num>>先运算
然后再运算=32,也就是把32赋值给num
num>>=0;
num=32
所以最后结果32
作者: 常佳杰    时间: 2012-6-20 08:17
左移<<:其实就是乘以2的移动的位数次幂
右移>>:就是除以2的移动的位数次幂
32>>32表示的是32除以4294967296(2的32次幂)....
int是四个字节 -2147483648 到2147483647
2的32次幂是4294967296,超出了整型范围产生错误,

建议把类型改成长整型long,就对了...
早上起来第一件事是先看看论坛嘿嘿,上午还有课呢,先下了
作者: 田建    时间: 2012-6-20 08:25
这个问题你得搞清楚各运算符之间的先后顺序,赋值运算符在位运算符的后面执行;
所以你的代码不论先位运算之后的结果是多少,之后都还是会把32赋给num;
如果你想打印位运算之后的结果,可以稍微将代码改一下:
  1. public class OperatorDemo2 {
  2.         public static void main(String[] args){
  3.                 int num =32;
  4.                 System.out.println(num>>2);
  5.         }

  6. }
复制代码

作者: 车风波    时间: 2012-6-20 08:46
你多了一个=
作者: 马林康    时间: 2012-6-20 08:46
陆强强 发表于 2012-6-20 07:28
这是两次运算,num>>先运算
然后再运算=32,也就是把32赋值给num
num>>=0;

这个不是赋值运算符吗? num=num>>32  就和num+=32一样吗?
作者: 马林康    时间: 2012-6-20 08:47
田建 发表于 2012-6-20 08:25
这个问题你得搞清楚各运算符之间的先后顺序,赋值运算符在位运算符的后面执行;
所以你的代码不论先位运算 ...

这个不是赋值运算符吗? num=num>>32  就和num+=32一样吗?
作者: 马林康    时间: 2012-6-20 08:48
车风波 发表于 2012-6-20 08:46
你多了一个=

没有 原题就是这样子的!
作者: 邓杰    时间: 2012-6-20 08:55
每个整数占4个字节;每个字节有八个二进制数位;所以不管一个整数向左还是向右移32位;都会回到原值。long的是8个字节。因此不管向左还是向右移64位,也会回到原值。你可以随便在写个整数和Long验证一下 因此答案没有问题;
public class OperatorDemo2 {

        public static void main(String[] args){

                int num =10;
                                //num=num>>32;
                                //num=num<<32;

                System.out.println(num>>=32);

        }


}
作者: 车风波    时间: 2012-6-20 08:57
马林康 发表于 2012-6-20 08:48
没有 原题就是这样子的!

=赋值不明白?
作者: 唐辉辉    时间: 2012-6-20 09:00
num>>=32
这里分为两步,第一步 num>> ,这里确实等于0。 第二步num=32,相当又给num赋值为32。所以输出32
作者: 余清兰    时间: 2012-6-20 09:06
在 JVM  中,> >   操作后面的数是int 类型的。 取右移位数的低5位,相当于右移位数与0x1f做了 &  运算。
你这里右移32位,32的二进制是100000,oxlf的二进制是11111,他们两个做 & 运算,结果等于100000
转成十进制结果还是32
num>>=32 相当于num = num >>32 ,所以运算后的结果是原数32


作者: 曾_强    时间: 2012-6-20 09:11
本帖最后由 jiyixuan 于 2012-6-20 09:12 编辑

如果对char,byte或者short类型的数值进行以为处理,那么在移位进行之前,他们会自动转换为int,并且得到的结果也是一个int类型的值,而右侧操作数,作为真正移位的位数,只有其二进制表示中的低5位才有用。这样可防止我们移位超过int类型值所具有的位数。(译注:因为2的5次方为32,而int类型只有32位)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到右操作数的低6位。以防止位移超过long类型数值具有的位数。
                                                                -----------------引自Thinking in Java   第50页

所以,楼主所遇到的>>32位,同时相当于>>0位。即值不会变。

十期有个帖子楼主可以去看看:会受益匪浅。

找到地址:http://bbs.itheima.com/thread-14666-1-1.html



作者: 陆强强    时间: 2012-6-20 09:11
本帖最后由 陆强强 于 2012-6-20 09:13 编辑
马林康 发表于 2012-6-20 08:46
这个不是赋值运算符吗? num=num>>32  就和num+=32一样吗?


i试了很多数字,int以2的32为界,超过2的32就先除以2的32次方。
比如int num=32;
System.out.println(num>>=35);
结果是4.
2的35次除以2的32次是2的3次=8
32除以8=4;结果是错的,系统错误
这种现象应该是内存问题,当超过INT时会回到起点。你可以看成两个圆相交。交点是0,0一边和2147483647连接,另一边和-2147483647连接

作者: 马林康    时间: 2012-6-20 09:15
余清兰 发表于 2012-6-20 09:06
在 JVM  中,> >   操作后面的数是int 类型的。 取右移位数的低5位,相当于右移位数与0x1f做了 &  运算。
...

谢谢 明白了
作者: 孙飞    时间: 2012-6-20 19:57
邓杰 发表于 2012-6-20 08:55
每个整数占4个字节;每个字节有八个二进制数位;所以不管一个整数向左还是向右移32位;都会回到原值。long ...

为什么向右移32位会回到原值啊,向右移的时候左边的空位不是补0吗?求指教
作者: 邓杰    时间: 2012-6-20 20:08
feigecal 发表于 2012-6-20 19:57
为什么向右移32位会回到原值啊,向右移的时候左边的空位不是补0吗?求指教 ...

这个我是问的群里的朋友 他跟我说的。至于原理嘛我还没有找到相关的参考资料;记住这个规律就行了;等我找到了再分享给吧、你自己也找找,找到也跟我分享下;




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