我有一个数组,其中字节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
答案 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,如您所说。