我有一个表达:
short w = (short) ((byte) dana) << x);
...
String.format ("%04X", w);
如果它们包括:
dana = (byte) 0x88;
和
int x = 5;
我收到 0xF100
而不是 0x1100
我该怎么做才能使它正确!
我有一个表达:
short w = (short) ((byte) dana) << x);
...
String.format ("%04X", w);
如果它们包括:
dana = (byte) 0x88;
和
int x = 5;
我收到 0xF100
而不是 0x1100
我该怎么做才能使它正确!
问题出在第一个演员表中:
(byte) dana
dana
被转换为byte
,因此当它稍后在表达式中使用时,需要将其扩大回int
,这通过符号扩展来完成。如果 number 为负数,所有高位都设置为 1 以保持其值在 2 补码中。
改用位掩码:
short w = (short) ((dana & 0xff) << x);
也许最好避免使用short
,因为 javaint
无论如何都会进行所有算术运算。
检查这个答案: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的回答也是有效的。
您可以执行按位和 (&) 操作来屏蔽高位。例如:
w &= 0x1fff;
问题在于,当将数据转换为字节时,符号位被激活并执行算术运算而不是逻辑运算。通过使用 nd 操作,高位被切断。或者您可以推迟转换并将其作为后处理进行。
有时也可以使用算术移位