java - 回复 : Convert Double to byte[] array

标签 java type-conversion double byte


引用( Double to byte[] )它包含了我需要的问题和解决方案。

private byte[] convert(Double d) {
    byte[] output = new byte[8];
    Long lng = Double.doubleToLongBits(d);
    for (int i = 0; i < 8; i++) {
        output[i] = (byte)((lng >> ((7 - i) * 8)) & 0xff);
    }
    return output;
}

但我不知道它是如何/为什么工作的,我知道循环正在将组成 Double 的 8 个字节中的每一个分配给数组。但我不明白字节是如何构造的。有人可以向我解释一下下面的表达式吗?

 ((lng >> ((7 - i) * 8)) & 0xff);

为什么是 Double.doubleToLongBits(d);参与其中?

最佳答案

让我们分解一下这个表达式:

((lng >> ((7 - i) * 8)) & 0xff);

一步一步来。 ((7 - i) * 8) 应该是显而易见的。 >> 是二进制右移运算符。它将其左操作数旋转右操作数从左侧填充 MSB 的位数。因此,lng 在每次迭代中都会旋转 (7-i) 字节数。

& 是按位 AND 运算符,这意味着如果两个操作数的相同位位置上都有 1,则得到 1,否则得到 0。因此,基本上与 进行 AND 运算0xff 基本上为我们提供了旋转后的 lng 的最后一个字节。

将它们放在一起,您可以从每次迭代中的最高有效字节开始获取 lng 的每个字节。

要回答问题的第二部分,请尝试直接旋转 double 值的位(您将得到一个严重的错误)。在Java中,double和long使用相同的字节数(8),因此如果要执行按位运算,必须先将double值转换为long。

关于java - 回复 : Convert Double to byte[] array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20176528/

相关文章:

c++ - 错误 : invalid conversion from ‘int (*)(void*)’ to ‘void* (*)(void*)’

java - 将对象转换为短对象

objective-c - 如何将 NSDecimalNumber 转换为 double

sql - PostgreSQL 将带有逗号分隔的整数的字符串拆分为逗号分隔的整数

java - Eclipse中的serialVersionUID生成是否使用serialver?

java - 如何根据 xml 元素的值通过 java 中的 xsd 验证 xml

java - 连接可选列表

swift - 你怎么能在swift中将一个数字 append 到一个double

java - 在 Java 中使用 double 类型进行除法时出错

java - 有没有办法从 Bean Validation 字段级 ConstraintValidator 中访问目标 bean?