右逻辑/无符号移位为符号位插入1而不是0

时间:2012-10-02 20:49:13

标签: java bit-manipulation bit-shift

我处理从CCS转换浮点数,它不遵循IEEE标准(而不是符号位,指数,尾数,它们使用指数,符号位,尾数);我使用>>>运算符遇到了一些奇怪的行为。

给定的

byte byte1=(byte)0x8A;     //10001010
byte byte2=(byte)(byte1>>>1);       //11000101

由于>>>指定它会插入0,为什么我会收到1

我可以对此进行编码,只需手动翻转,但我不想发现它是特定于平台的。

3 个答案:

答案 0 :(得分:2)

在java中,字节在转换操作之前自动转换为int。在学术上,你所做的相当于:

byte byte2=(byte)(((int)byte1)>>>1);

当然,强制转换为int符号。如果您将结果保留为整数,则会看到(当时)期望值0x7FFFFFC5。

要解决这个问题,只需将第8位屏蔽掉即可。

byte byte2 = (byte) (byte1 >>> 1 & 0x7F);

Related question

这种行为是不是很明智和预期,而且不是很棒吗?

答案 1 :(得分:1)

不要使用字节,坚持使用int。但是,运行以下代码:

    int int1 = 0x8A;
    System.out.println(formatBinary(int1));
    int int2 = int1 >>> 1;
    System.out.println(formatBinary(int2));

获取此输出(使用名为formatBinary的格式化打印方法,这是无关紧要的):

8a: 10001010
45: 01000101

答案 2 :(得分:0)

你正在使用整数,而不是字节。 int值必须比您移入的第8位高1位。