黑马程序员技术交流社区
标题:
关于二进制操作的问题
[打印本页]
作者:
黑马--马超
时间:
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