2012-08-12 219 views
1

要conbine 2字节成短:寻找一种方式来conbine的0xA5,并为0x9c到0xa59c

/* combine 0xa5 and 0x9c to 0xa59c */                             
public class Unsigned 
{ 
    public static void main(String[] args) 
    { 
     byte a = (byte) 0xa5; 
     byte b = (byte) 0x9c; 
     //int c = ((a&0xff)*256)&0xffff+(b&0xff); // 0 
     //int c = a*256+b; // ffffa49c 
     int c = (int)a*256+(int)b; // ffffa49c 
     System.out.printf("%4x\n", c); 
    } 
} 

为什么他们都是不正确的?

====

的可行版本:

/* combine 0xa5 and 0x9c to 0xa59c */                             
public class Unsigned 
{ 
    public static void main(String[] args) 
    { 
     byte a = (byte) 0xa5; 
     byte b = (byte) 0x9c; 
     //int c = ((a&0xff)*256)&0xffff+(b&0xff); // 0 
     //int c = a*256+b; // ffffa49c 
     //int c = (a&0xff)*256+(b&0xff); // a59c 
     int c = ((a & 0xFF)<< 8) | (b & 0xFF); // a59c 
     System.out.printf("%4x\n", c); 
    } 
} 
+1

什么你的意思是“不正确”吗?你期望发生什么?究竟发生了什么? – Jeffrey 2012-08-12 15:10:38

回答

1

你需要做的是这样的:

int c = ((a & 0xFF)<< 8) | (b & 0xFF); 
+0

在清除8个LSB之前应用位移将完全清除“a”值。您必须切换操作。 – 2012-08-12 15:19:53

+2

你是对的。我有点傻,让我和他错了。现在进行测试,它可以正常工作。 – 2012-08-12 15:24:54

+0

非常感谢你 – pengguang001 2012-08-14 03:34:56

3

您可能需要使用按位运算,而不是乘法。为了避免将字节转换为int(都是带符号的)的符号扩展,您可以为第一个最低有效位8位应用位掩码。在代码中:

int a_byte = ((int)a & 0xFF); 
int b_byte = ((int)b & 0xFF); 
int c = (a_byte << 8) | b_byte; 

一个总和而不是按位OR也可以在这里工作而没有任何后果。在这种情况下,显式转换为int也可以省略。

要回答实际问题:您插入的值实际上是负值(超过0x7F)。将两者都转换为整数的结果保持负号,其将所有附加24位设置为1.这当然影响结果。

1

System.out.printf("%x\n",(short)((a << 8) | (0xff & b)));

它转换为short拿到2个字节,而不是ffffa59c

左移保持A5和OR0xff&b(这是0xff9c所以当你OR你保持a5

相关问题