社区
Java SE
帖子详情
关于有符号右移>>与无符号右移>>>
fengyepiaoling
2006-03-04 05:07:19
byte b=(byte)0xf1;
byte c=(byte)(b>>4);//有符号右移
byte d=(byte)(b>>>4);//无符号右移(即高位自动填充0)
byte e=(byte)((b&0xff)>>4);
我们都知道在运算中间过程中,byte类型先被提升为int类型后再实行右移运算,在这个程序中,为何c和d的结果一致,也就是说>>>运算符并没有实现我们预期中的功能,而e却实现了,e的结果与我们想象中的b>>>4的结果一致,为什么?
...全文
2067
1
打赏
收藏
关于有符号右移>>与无符号右移>>>
byte b=(byte)0xf1; byte c=(byte)(b>>4);//有符号右移 byte d=(byte)(b>>>4);//无符号右移(即高位自动填充0) byte e=(byte)((b&0xff)>>4); 我们都知道在运算中间过程中,byte类型先被提升为int类型后再实行右移运算,在这个程序中,为何c和d的结果一致,也就是说>>>运算符并没有实现我们预期中的功能,而e却实现了,e的结果与我们想象中的b>>>4的结果一致,为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
f_acme
2006-03-04
打赏
举报
回复
在Thinking in Java第三章中的一段话:
移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。
JavaScript 无
符号
右
移
赋值操作
示例代码: result
>>>
>= expression 其中参数是result任何变量。 expression是任何表达式。 JavaScript中无
符号
右
移
赋值操作说明 使用
>>>
>= 运算符和使用下面的语句是等效的: result = result
>>>
> expression
>>>
>= 运算符把 result 的所有位向
右
移
expression 指定的位数。
右
移
后左边空出的位用零来填充。向
右
移
出的位被丢弃。例如: var temp temp = -14 temp
>>>
>= 2 变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 1111
JavaScript 无
符号
右
移
运算符
无
符号
右
移
运算符 (
>>>
>)是
右
移
表达式的位,不保留
符号
。
java 位运算之无
符号
右
移
>>>
>>>
有
符号
右
移
>>>>
java 无
符号
右
移
>>>
>>>
有
符号
右
移
>>>>
>>有
符号
右
移
和>>>无
符号
右
移
做下面这道题目的时候,如果用有
符号
右
移
>>>>,那碰到这个测试用例的时候:11111111111111111111111111111101,由于会一直在高位补1,所以会陷入死循环,超出时间限制。
>>>
:溢出位舍弃,空出来的位用原来数的最高位补齐(有可能是用1来补位,也有可能是用0补位)
>>>
>而无
符号
右
移
补高位的时候一定用的是0,跟
符号
位没有关系,所以叫无
符号
右
移
。总结:
>>>
之所以叫有
符号
右
移
,是因为补高位的时候用的是
符号
位来补。所以我们需要高位补0,于是将
>>>
换成
>>>
>>>
>和
>>>
>都是
右
移
。
有
符号
右
移
>>>>,无
符号
右
移
>>>
>>>
计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负 1.有
符号
右
移
>>(若正数,高位补0,负数,高位补1) 正数:例如4>>2 首先写出4的二进制数,因为是正数所以最高位为0,也就是第一个 0000 0000 0000 0000 0000 0000 0000 0100
右
移
两位得到(高位补0) 000000 0000 0000...
Java SE
62,616
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章