如何获取double
或float
的单个位(或整个变量)?
例如,如果我有 float a = 0.5;
我期望得到一个等于"00111111000000000000000000000000"
的String
。
或者以十六进制表示为:
"F000000"
如何获取double
或float
的单个位(或整个变量)?
例如,如果我有 float a = 0.5;
我期望得到一个等于"00111111000000000000000000000000"
的String
。
或者以十六进制表示为:
"F000000"
Java中,float类型占用32位,类似于int类型,而double类型占用64位,类似于long类型。如果要找到这些数字的二进制表示,需要进行以下操作:
float a = 0.5f;
int bits = Float.floatToIntBits(a);
String.format("%32s", Integer.toBinaryString(bits)).replace(" ", "0");
String.format("%8s", Integer.toHexString(bits)).replace(" ", "0");
"00111111000000000000000000000000" 的二进制表示(32位)
"3f000000" 的十六进制表示(32位)
double a = 0.5d;
long bits = Double.doubleToLongBits(a);
String.format("%64s", Long.toBinaryString(bits)).replace(" ", "0");
String.format("%16s", Long.toHexString(bits)).replace(" ", "0");
"0011111111100000000000000000000000000000000000000000000000000000" 代表64位的二进制数字
"3fe0000000000000" 代表64位的十六进制数字
您可以通过执行反向操作来验证其是否有效:
int bits = Integer.parseInt("00111111000000000000000000000000", 2);
Float.intBitsToFloat(bits);
0.5(浮点数)
long bits = Long.parseLong("0011111111100000000000000000000000000000000000000000000000000000", 2);
Double.longBitsToDouble(bits);
0.5(双精度)
对于十六进制表示,您可以分别使用Integer.parseInt("...", 16);
和Long.parseLong("...", 16);
Long.toBinaryString
不会打印多余的位数,因为"This [unsigned long] value is converted to a string of ASCII digits in binary (base 2) with no extra leading 0's",但这并不仅限于符号位。你可以从左边用零填充该值以获得所需的列宽。 - Mike Samuel查看Float.floatToIntBits() 或 Float.floatToRawIntBits()
。 这会将浮点数以int形式返回其位。 如果需要字符串形式,使用Integer.toBinaryString()
。
注意,如果HSB存在问题,您可能需要转换为long型以避免“溢出”。
public void printFloatBits(float f) {
int bits = Float.floatToIntBits(f);
// Extract each bit from 'bits' and compare it by '0'
for (int i=31; i>=0; --i) {
// int mask = 1 << i;
// int oneBit = bits & mask;
// oneBit == 0 or 1?
System.out.print((bits & (1 << i)) == 0 ? "0" : "1");
}
}
Double.byteValue()
可能会对你有所帮助。
还有一个 32 位等效的 Float.byteValue()
。
(byte) myDouble
,这是一种有损转换。 - Mike SamuelFloat.byteValue()
和Double.byteValue()
只是将数字强制转换为字节。 - Pacerier