黑马程序员技术交流社区

标题: <<运算的小问题 [打印本页]

作者: 曹震国    时间: 2014-12-16 23:47
标题: <<运算的小问题
按照左移运算规则  
一个数左移几位,结果就是这个数乘以2的几次幂。
2<<29位结果是1073741824   //可以理解
2<<30位结果是-2147483648   //理解不了
2<<31位结果是0       //理解不了

请大神指教
作者: 王海生    时间: 2014-12-16 23:53
我又学学习到了,楼主继续努力噢噢·····
作者: 飞跃离开    时间: 2014-12-16 23:57
2<<31  在int类型中,2的二进制表现形式是30个0+10,共32位。左移了31位把1也给移走了。在原来的32位数中只剩下一个0,然后空余的31位都补0。得到的32位全为0。所以2<<31位结果是0
作者: zmhlnrs    时间: 2014-12-17 00:08
因为2的二进制是10;当把2左移一定位数,比如30位的时候就是10000000 00000000 00000000 00000000这个数字就是十进制的-2147483648这个数字,如果在左移1位就是一个特殊情况,程序底层会有一个把最高位舍弃的动作,所以移动31位的时候就是0。
要注意如果移动的位数比int类型的位数大,比如左移33位就会用33%32=1;1的二进制是000000001,会用这个二进制数左移1位得到2左移33位后的数字也就是2左移33位后还是等于2.
作者: 呢?    时间: 2014-12-17 00:13
学习了~~~~
作者: 青衫禅客    时间: 2014-12-17 00:25
一个数位移的话,是在数值类型的取值范围里面循环的
作者: quick3g    时间: 2014-12-17 01:18
00000000000000000000000000000010        2
10000000000000000000000000000000      <<30位结果: -2147483648(1移动到了符号位)
00000000000000000000000000000000      <<30位结果:0(左边的1被0取代)

作者: 清诗纪事    时间: 2014-12-17 20:14
看楼上,很明确,左侧第一位是符号位,1代表负数,0代表整数,2左移30位就变成2的31次幂,符号位是1,就是负数,左移结果是-2的31次幂=-2147483648
作者: dandan520    时间: 2014-12-17 20:19
0;;;0   不就那么算吗
作者: jxlovqqvo    时间: 2014-12-17 22:10
看基础视频你就明白了
作者: 曹震国    时间: 2014-12-17 23:23
那这个运算规则就不成立了???
一个数左移几位,结果就是这个数乘以2的几次幂
作者: 王海生    时间: 2014-12-17 23:43
很不错`````继续努力
作者: 探寻者    时间: 2014-12-18 00:06
7楼解释的很直观,就是超出了数值范围,30次方是把1移到了符号位,31次方就溢出了
作者: 林文龙    时间: 2014-12-18 05:51
int是三十二位,左移后要考虑一下之后的数是不是在-2^31~2^31-1内,位运算符是二进制运算,从基本去想就明白
作者: lgc黑马    时间: 2014-12-18 07:39
例2<<3==2*2^3




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