Java位移(lsh)<< - Java中的错误?

时间:2013-10-23 12:42:04

标签: java bit-manipulation bit-shift

我有一个表达式:

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

如果包括:

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

我收到0xF100

而不是0x1100

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

3 个答案:

答案 0 :(得分:1)

问题在于第一次演员:

(byte) dana

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

改为使用位掩码:

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

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

答案 1 :(得分: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的答案也是有效的。

答案 2 :(得分:-1)

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

w &= 0x1fff;

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

有时也可以使用算术移位