首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逻辑和算术移位输出

逻辑和算术移位输出
EN

Stack Overflow用户
提问于 2015-03-31 22:33:02
回答 1查看 94关注 0票数 0

这里有一个很小的java程序

代码语言:javascript
复制
public class otherclass {
public static void main(String[]args){
        byte a=-5;

        byte d= (byte) (a>>>1);
        System.out.println(d);
        byte e= (byte) (a>>>2);
        System.out.println(e);
        byte f= (byte) (a>>1);
        System.out.println(f);
        byte g= (byte) (a>>2);
        System.out.println(g);
}
}

产出:

代码语言:javascript
复制
-3
-2
-3
-2

我理解的第二个输出(逻辑移位的-3和-2 )。

负5是11111011

算术移位向右移动,左边的附加位类似于MSB。因此,一次移动使11111101为负3,负2也很好。

逻辑移位应该在左边添加零。11111011应该变成01111101,也就是125。它又如何输出负3?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-31 22:36:52

缺少的信息是,当位转换时,Java将值提升到int,称为二进制数值提升。byte值在它们被移动之前被提升到int,然后发生转移,然后将它们转换回byte

代码语言:javascript
复制
-5 as byte  : 11111011
-5 as int   : 11111111 11111111 11111111 11111011
Bit shifted : 01111111 11111111 11111111 11111101

零位被移入,但是转换回byte,除了最后的8位之外,所有这些都被丢弃了。

代码语言:javascript
复制
Cast to byte: 11111101 (-3)

如果希望>>>操作表现为没有二进制数字提升,那么必须从提升的int中屏蔽最后的8位。

代码语言:javascript
复制
byte d= (byte) ((a & 0xFF)>>>1);
System.out.println(d);
byte e= (byte) ((a & 0xFF)>>>2);
System.out.println(e);

输出:

代码语言:javascript
复制
125
62

这里发生了什么:

代码语言:javascript
复制
-5 as byte  : 11111011
-5 as int   : 11111111 11111111 11111111 11111011
Bit masked  : 00000000 00000000 00000000 11111011
Bit shifted : 00000000 00000000 00000000 01111101

零和以前一样被移进,但是转换回byte,它会丢弃所有的东西,除了最后的8位。

代码语言:javascript
复制
Cast to byte: 01111101 (125)

请注意,这将发生在>>>>>中,因此只对位和对>>>操作的0xFF发生。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29379734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档