2

我想在一个字节中切换两个十六进制符号,例如,如果

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

任何人都可以阐明为什么这不起作用?

4

2 回答 2

4

我怀疑问题是符号扩展。具体来说,你可能需要做

byte hex2 = (byte) ((in >>> 4) & 0xF);
于 2012-12-16T02:27:54.313 回答
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 -> 0xFFFFFFFF; 移位后为 0x7FFFFFFF;转换为字节-> 0xFF

    byte x = (byte)0xFF;
    x = (byte) ((x & 0xFF) >>> 1);
    System.out.println(x);

打印127是因为我们截断了 0xFFFFFFFF -> 0x000000FF,现在 shift 产生 0x0000007F,转换为字节 -> 0x7F

实际上,这个提升是在编译时完成的。JVM 仅适用于 4 或 8 字节操作数(堆栈上的局部变量)。即使是字节码中的布尔值也是 0 或 1 int。

于 2012-12-16T02:32:30.247 回答