【发布时间】:2023-03-05 02:06:01
【问题描述】:
我有这样的 64 位值:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1101 0011
给定数字流的十进制值为-45。
我想分成四个 16 位值:
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1101 0011
输入值是有符号长的。
如何在 Java 中做到这一点?
到目前为止,我已经尝试过这种方式:
long[] buf = new long[4];
buf[0] = (l&0xFF);
buf[1] = (l&0xFF >> 16) & 0XFF;
buf[2] = (l&0xFF >> 32) & 0XFF;
buf[3] = (l&0xFF >> 48) & 0XFF;
但我认为我在移位逻辑方面搞砸了。
编辑
感谢@Eugene,正确的解决方案是:
long l = 45;
long[] buf = new long[4];
buf[0] = (l & 0xFFFF);
buf[1] = l >> 16 & 0XFFFF;
buf[2] = l >> 32 & 0XFFFF;
buf[3] = l >> 48 & 0XFFFF;
long result = ( buf[3] & 0xFFFF) << 48 | ( buf[2] & 0xFFFF) << 32 | (buf[1] & 0xFFFF) << 16 | (buf[0] & 0xFFFF);
System.out.println("Decimal: " + result);
System.out.println("Binary: "Long.toBinaryString(result));
【问题讨论】:
-
是否存储为字符串?您的 64 位值是否称为“输入值”?
-
它不存储为字符串。它像长数据类型一样存储。我不太了解的部分是位操作。对于每组 16 位,结果应该是四个元素的数组。
-
欢迎来到 Stack Overflow!请拿起tour,环顾四周,并通读help center,尤其是How do I ask a good question? 和What topics can I ask about here?。从第二个链接:“要求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的摘要,以及您在解决问题时遇到的困难的描述。” ——就算没有作业……
标签: java 64-bit bit-manipulation 16-bit