0

我有一个表达:

short w = (short) ((byte) dana) << x);
...
String.format ("%04X", w);

如果它们包括:

dana = (byte) 0x88;int x = 5;

我收到 0xF100

而不是 0x1100

我该怎么做才能使它正确!

4

3 回答 3

1

问题出在第一个演员表中:

(byte) dana

dana被转换为byte,因此当它稍后在表达式中使用时,需要将其扩大回int,这通过符号扩展来完成。如果 number 为负数,所有高位都设置为 1 以保持其值在 2 补码中。

改用位掩码:

short w = (short) ((dana & 0xff) << x);

也许最好避免使用short,因为 javaint无论如何都会进行所有算术运算。

于 2013-10-23T12:52:12.257 回答
1

检查这个答案:How to cast from int to byte, then use a bitshift operator

您以(扩展符号)开头

  1111 1111 1111 1111 1111 1111 1000 1000

做轮班

  1111 1111 1111 1111 1111 0001 0000 0000

当您转换为空时,您以

  1111 0001 0000 0000

这是你得到的结果。

解决方案是使用更广泛的值(至少short),因此它不会是负数。zch的回答也是有效的。

于 2013-10-23T12:58:14.260 回答
-1

您可以执行按位和 (&) 操作来屏蔽高位。例如:

w &= 0x1fff;

问题在于,当将数据转换为字节时,符号位被激活并执行算术运算而不是逻辑运算。通过使用 nd 操作,高位被切断。或者您可以推迟转换并将其作为后处理进行。

有时也可以使用算术移位

于 2013-10-23T12:46:50.027 回答