在java中使用大二进制数 - 得到错误的结果

时间:2017-10-26 12:50:37

标签: java

我有一个数组,其中字节1,2,4,5,6,7以这种方式表示一个大值:

   (most significant) byte2-byte1-byte7-byte6-byte5-byte4 (less significant)

bytes = [43,1,0,-13,-112,56,94,105,20,0,3,0,0,0,0,0,0,0,0]

如何获得这48位新值?

这是我到目前为止所尝试的:

long byte1 = (bytes[0] & 0xFF);
byte1 = byte1<<32 ;         
long byte2 = (bytes[1] & 0xFF);
byte2 =byte2<<40;   

long time = (byte2|byte1|
                ((bytes[7] & 0xFF) << 24) |
                ((bytes[6] & 0xFF) << 16) |
                ((bytes[5] & 0xFF) << 8) |
                ((bytes[4] & 0xFF) << 0));

我预计的时间输出:6062749840

使用long后我甚至得到了:1285963004048

00000000 000000001 01101001 01011110 00111000 10010000 = 6062749840

2 个答案:

答案 0 :(得分:0)

如果您想向左移动超过64位,可以使用BigInteger

BigInteger shiftedNumber = BigInteger.valueOf(initialValue).shiftLeft(n);

答案 1 :(得分:0)

在调试器中运行程序或插入System.out.println()语句以查看发生的情况非常简单。你应该学会使用调试器,这将是一个很好的投资。这两种方法都会告诉您中间结果是:

long byte1 = (bytes[0] & 0xFF); // 43 or 00101011
byte1 = byte1<<32 ;          // 184683593728 or 0010101100000000000000000000000000000000
long byte2 = (bytes[1] & 0xFF); // 1 or 00000001
byte2 =byte2<<40;    // 1099511627776 or 000000010000000000000000000000000000000000000000

long time = (byte2|byte1|
                ((bytes[7] & 0xFF) << 24) |
                ((bytes[6] & 0xFF) << 16) |
                ((bytes[5] & 0xFF) << 8) |
                ((bytes[4] & 0xFF) << 0)); // 1285963004048 or 000000010010101101101001010111100011100010010000

但是,你说你想使用字节1和2,而不是0和1.所以让我们更正你的代码:

long byte1 = (bytes[1] & 0xFF);
byte1 = byte1<<32 ;         
long byte2 = (bytes[2] & 0xFF);

现在结果是6062749840或000000000000000101101001010111100011100010010000,如您所说。