在一个字节中切换十六进制符号

时间:2012-12-16 02:24:06

标签: java hex switch-statement bit-manipulation

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

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

任何人都可以解释为什么这不起作用?

2 个答案:

答案 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。