黑马程序员技术交流社区

标题: 关于二进制操作的问题 [打印本页]

作者: 黑马--马超    时间: 2012-7-24 16:41
标题: 关于二进制操作的问题
本帖最后由 cookie110 于 2012-7-24 18:25 编辑

问题:
1.为什么二进制只能对INT型整数进行移位?
2.为什么对于整数0无法进行移位;
3.为什么-1无法向右移位
作者: 刘海源    时间: 2012-7-24 16:59
二进制数在计算机里边存储的情况是这样的
比如6
00000000  00000000 00000000 00000110
这里的八个数字为一个字节,一个字节由八个毕克伟组成
二进制的实质是满2进1所以不会有2数组出现
0呢本来就在计算机中以00000000  00000000 00000000 00000000存在
所以不会再移位了怎么移都是0
而-1也是如此在计算机中以11111111 11111111  11111111  11111111存在
所以不能再向右移位了前边怎么移都的用1补位所以怎么弄都是-1

作者: 侯宪博    时间: 2012-7-24 17:26
首先,移位操作不只是对应于int型收据的
对于0不是不能操作
即便是操作每一位都是0左移右移还都是0
-1不是不能移位,而是关系到移位的原理,
-1在内存中的补码就是
1111-1111  1111-1111  1111-1111  1111-1111
右移的话因为他是负数会默认在左边插入1
所以无论怎么移位都还是
1111-1111  1111-1111  1111-1111  1111-1111
左移位运算符( < <)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
“有符号”右移位运算符(> > )则将运算符左边的运算对象向右移动运算符右侧指定的位数。“
有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
Java也添加了一种“无符号”右移位运算符(> > > ),它使用了“零扩展”:无论正负,都在高位插入0。
希望对楼主有所帮助。。。。
作者: 肖琦    时间: 2012-7-24 18:01
一、能够进行按位操作的有都是整型数值,有int,char,byte,short,long
        移位运算符有<<,>>,>>>
        对于字节数小于int的整型,在进行操作时一律转为整型:
       例如:
           byte a = 1;
           byte b = a>>1;会报错,因为a>>1时,已经被转成了整型,
       其中,char,byte,short的正数转整型时,高位补0,在byte和short中的负数转整型时,高位补1.
       另外,long也可以进行移位,所以你说的“二进制只能对INT型整数进行移位”就无从谈起了。
二、这点楼上已经说清楚了。
三、向右位移有两种方式:>>和>>>
        >>使用了符号扩展,即:若符号为正,在最高位插入0,否则,在最高位插入1,所以-1>>n都等于-1,
     因为-1的二进制表示为11111111 11111111  11111111  11111111,插1后不变
>>>不适用符号扩展,一律在高位插0,所以-1>>>1就等于2147483647了,发生变化了

希望对你有帮助......



作者: 黑马--马超    时间: 2012-7-24 18:25
几位回答的很精彩,谢谢!
作者: 杜佳瑞    时间: 2012-7-24 20:31
整型数值都能移位,不只是int型;
0无论左移还是右移都用0补齐,最终还是0;
-1右移最高位用1补齐,最终还是-1。




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