2012-10-02 54 views
2

我正在处理从CCS转换浮点数,它不符合IEEE标准(而不是符号位,指数,尾数,它们使用指数,符号位,Mantissa);我遇到了一些使用>>>运算符的奇怪行为。正确的逻辑/无符号移位插入1而不是0符号位

给出

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

由于>>>指定它将插入0,为什么我得到一个1

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

+0

在数字前加'0x'告诉JVM它是一个十六进制值(在这个例子中是0x8A),比Byte.decode简单:)编辑:事实上,Byte.decode不起作用有... –

+0

@亚历山大科尔曼真实,并且很好。在这种情况下,我实际上并没有这样做,只是将它用于示例的目的。我收到的REAL'Byte'已经有'8A'了。谢谢。 – Sheriff

+0

你必须投到字节(这是一个int);)但是好的 –

回答

2

在java中,字节被转换为整数的移位之前自动对他们进行操作。在编码上,你在做什么等价于:

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

而且,当然,转换为int符号扩展。如果将结果保留为整数,则会看到0x7FFFFFC5的(当时)期望值。

为了解决这个问题,只需要掩盖第8个位。

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

Related question

这不是明智的行为和预期,而不是Java的伟大?

0

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

+0

完全删除了'int',所有'byte's。仍然是相同的结果。无论如何,bitshift似乎都会返回一个“int”,所以我不得不将其转换为“byte”。 – Sheriff

1

不要使用字节,请使用int。但是,运行下面的代码:

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

让我这个输出(与被叫formatBinary格式化打印方法,它是不相关的):

8a: 10001010 
45: 01000101 
相关问题