Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将64位数据转换为有符号长值_Java_Binary_Byte_Bit - Fatal编程技术网

Java 将64位数据转换为有符号长值

Java 将64位数据转换为有符号长值,java,binary,byte,bit,Java,Binary,Byte,Bit,我有这样的想法: byte[0] = 0001 0100 0011 0100 (dec value: 5172) byte[1] = 0000 0000 0111 1100 (dec value: 124) byte[2] = 0000 0000 0000 0000 (dec value: 0) byte[3] = 0000 0000 0000 0000 (dec value: 0) 我想将它们结合起来,在Java中生成一个长值。怎么做 可以用这种方式转换吗 结果=0+(0

我有这样的想法:

byte[0] = 0001 0100 0011 0100  (dec value: 5172)  
byte[1] = 0000 0000 0111 1100  (dec value: 124)  
byte[2] = 0000 0000 0000 0000  (dec value: 0)  
byte[3] = 0000 0000 0000 0000  (dec value: 0)
我想将它们结合起来,在Java中生成一个长值。怎么做

可以用这种方式转换吗

结果=0+(0 x 2^16)+(0 x 2^16)+(124 x 2^32)+(5127 x 2^48)

结果=字节[3]+(字节[2]x2^16)+(字节[1]x2^32)+(字节[0]x2^48)


编辑:让我试着更好地解释。当我打开工具ModScan32并连接到我的设备时,我看到一些寄存器。在这个工具中,有不同种类的选项来显示数据。其中之一是将它们表示为二进制或十进制。当我选择二进制或十进制时,我得到的值与上面示例中的值相同。当我用我的软件读取这些数据时,我得到的十进制数完全相同(转换值)。现在我的问题是,如果有必要在4个16位寄存器中保存数据,并且我知道它们的十进制值,那么将寄存器中的值组合起来并获得实际值的正确方法是什么?

您的想法基本上是正确的。有几件事需要注意

我相信您所追求的结果是
00001000010100000000001111000000000000000000000000000000000000000000

以下是一个无效的尝试:

    int[] registers = { 5172, 124, 0, 0 };
    long result = registers[0] << 48 | registers[1] << 32 | registers[2] << 16 | registers[3];
    System.out.println(Long.toBinaryString(result));
我们只有结果的前32位,这还不够好。尝试读取时,请注意
Long.tobinarysting()
不包括前导零。想象数字前面有3个零


但是发生了什么事?最后的32位到哪里去了?即使它们都是零。问题是我们在
int
s中进行计算,它们是32位,而不是64位。编辑:我之前的解释在这一点上并不完全正确。事实是:在执行
时,我并没有真正了解您的值是如何存储的,但是如果您知道十进制值,为什么不直接编写它们呢?否则,当我从设备中读取十进制值时,考虑内置的int long。Paselong方法,就像上面的例子一样,设备中的每个值都存储在4个16位寄存器中,所以我需要将这些值从寄存器转换为长值。我不知道怎么做。你的字节是16位??请查收。没有将值5172存储在类型为
byte
的变量中的方法。除此之外,您是否尝试过自己的想法?有用吗?很好,你解释得更好。当你这么做的时候会更好,(这次我是为你做的)。谢谢你的详细解释。这确实有助于更好地理解。很高兴你喜欢它。如果你想知道确切的真相,请注意我对

10100001101000000000001111100
    long result = ((long) registers[0]) << 48 | ((long) registers[1]) << 32 | registers[2] << 16 | registers[3];
1010000110100000000000111110000000000000000000000000000000000
    int[] registers = { 5172, -124, 0, 0 };
    int[] registers = { 5172, -124, 0, 0 };
    long result = ((long) registers[0] & 0xFFFF) << 48
            | ((long) registers[1] & 0xFFFF) << 32 
            | (registers[2] & 0xFFFF) << 16 
            | (registers[3] & 0xFFFF);
    System.out.println(Long.toBinaryString(result));
1010000110100111111111000010000000000000000000000000000000000