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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林康 中级黑马   /  2012-6-20 03:15  /  2999 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马林康 于 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吗?

16 个回复

倒序浏览
这是两次运算,num>>先运算
然后再运算=32,也就是把32赋值给num
num>>=0;
num=32
所以最后结果32

评分

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

查看全部评分

回复 使用道具 举报
左移<<:其实就是乘以2的移动的位数次幂
右移>>:就是除以2的移动的位数次幂
32>>32表示的是32除以4294967296(2的32次幂)....
int是四个字节 -2147483648 到2147483647
2的32次幂是4294967296,超出了整型范围产生错误,

建议把类型改成长整型long,就对了...
早上起来第一件事是先看看论坛嘿嘿,上午还有课呢,先下了
回复 使用道具 举报
这个问题你得搞清楚各运算符之间的先后顺序,赋值运算符在位运算符的后面执行;
所以你的代码不论先位运算之后的结果是多少,之后都还是会把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 07:28
这是两次运算,num>>先运算
然后再运算=32,也就是把32赋值给num
num>>=0;

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

这个不是赋值运算符吗? num=num>>32  就和num+=32一样吗?
回复 使用道具 举报
车风波 发表于 2012-6-20 08:46
你多了一个=

没有 原题就是这样子的!
回复 使用道具 举报
邓杰 中级黑马 2012-6-20 08:55:59
9#
每个整数占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);

        }


}

评分

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

查看全部评分

回复 使用道具 举报
马林康 发表于 2012-6-20 08:48
没有 原题就是这样子的!

=赋值不明白?
回复 使用道具 举报
num>>=32
这里分为两步,第一步 num>> ,这里确实等于0。 第二步num=32,相当又给num赋值为32。所以输出32
回复 使用道具 举报
在 JVM  中,> >   操作后面的数是int 类型的。 取右移位数的低5位,相当于右移位数与0x1f做了 &  运算。
你这里右移32位,32的二进制是100000,oxlf的二进制是11111,他们两个做 & 运算,结果等于100000
转成十进制结果还是32
num>>=32 相当于num = num >>32 ,所以运算后的结果是原数32

回复 使用道具 举报
本帖最后由 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: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:06
在 JVM  中,> >   操作后面的数是int 类型的。 取右移位数的低5位,相当于右移位数与0x1f做了 &  运算。
...

谢谢 明白了
回复 使用道具 举报
邓杰 发表于 2012-6-20 08:55
每个整数占4个字节;每个字节有八个二进制数位;所以不管一个整数向左还是向右移32位;都会回到原值。long ...

为什么向右移32位会回到原值啊,向右移的时候左边的空位不是补0吗?求指教
回复 使用道具 举报
feigecal 发表于 2012-6-20 19:57
为什么向右移32位会回到原值啊,向右移的时候左边的空位不是补0吗?求指教 ...

这个我是问的群里的朋友 他跟我说的。至于原理嘛我还没有找到相关的参考资料;记住这个规律就行了;等我找到了再分享给吧、你自己也找找,找到也跟我分享下;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马