我想在一个字节中切换两个十六进制符号,例如
input = 0xEA
然后
output = 0xAE
它必须在java中。
我已经制作了这个方法,但它只适用于某些情况:
public static final byte convert(byte in){
byte hex1 = (byte) (in << 4);
byte hex2 = (byte) (in >>> 4);
return (byte) (hex1 | hex2);
}
一个工作示例是:
input: 0x3A
hex1: 0xA0
hex2: 0x03
output: 0xA3
一个不起作用的例子是:
input: 0xEA
hex1: 0xA0
hex2: 0xFE
output: 0xFE
任何人都可以解释为什么这不起作用?
答案 0 :(得分:4)
我怀疑问题是符号扩展。具体来说,你可能需要做
byte hex2 = (byte) ((in >>> 4) & 0xF);
答案 1 :(得分:1)
试
byte hex1 = (byte) (in << 4);
byte hex2 = (byte) ( in >>> 4);
return (byte) (hex1 | hex2 & 0x0F);
这就像一个已知的谜题
byte x = (byte)0xFF;
x = (byte) (x >>> 1);
System.out.println(x);
打印-1
因为在无符号移位0xFF被提升为int之前 - &gt; 0xFFFFFFFF的;移位后它是0x7FFFFFFF;强制转换为字节 - &gt; 0xFF的
但是
byte x = (byte)0xFF;
x = (byte) ((x & 0xFF) >>> 1);
System.out.println(x);
打印127
,因为我们截断了0xFFFFFFFF - &gt; 0x000000FF,现在shift产生0x0000007F,转换为byte - &gt; 0x7F的
实际上,此促销活动是在编译时完成的。 JVM仅适用于4或8个字节的操作数(堆栈上的局部变量)。甚至字节码中的布尔值为0或1 int。