提问人:Cat 提问时间:10/16/2022 最后编辑:Attila TCat 更新时间:10/19/2022 访问量:101
如何在不使用 Java 中的 Integer.toBinaryString 的情况下将双数或浮点数或负数转换为二进制?
How do I convert double or float or negative number to binary without using Integer.toBinaryString in java?
问:
我找到了这种方法,它对字节/短/整/长类型的正数非常有效,但如果我键入浮点数/双精度数或负数,则无法正常工作。我之所以需要在不使用的情况下完成它,是因为我在学校有这个任务,我们的老师说我们不能使用它。Integer.toBinaryString()
private static String toBinary(long d) {
String s = "";
while (d > 0) {
s = ((d % 2) == 0 ? "0" : "1") + s;
d = d / 2;
}
System.out.println(s);
return s;
}
答:
0赞
kvantour
10/18/2022
#1
注意:下面的代码是用伪语言编写的
假设我们对 f 的二进制表示感兴趣,那么有几个步骤需要完成。假设它包含二进制字符串并初始化为“0”。s
- 确定标志
s=" 0."; if (f < 0) { s = "-0."; f = -f }
- 确定指数:搜索 n,使得 0.5 ≤ f × 2n < 1 :
n=0; while ( f < 0.5 || f >= 1) { n += (f > 1 ? 1:-1); f *= (f > 1 ? 0.5 : 2) }
- 确定数字 我们假设停止条件是,因为每个IEEE编号在数字上都是一个有限数,它是2的幂的线性组合。
f *= 2 while (f != 0) { if (f > 0) {s += "1" : f -= 1 } else { s += "0" } f *= 2 }
f != 0
- 打印值
print s "E" n
这是执行上述操作的快速行:awk
$ awk 'BEGIN { f = sqrt(42); n = 0
s=(f<0 ? "-0." : " 0."); f=(f<0 ? -f : f)
while ( f < 0.5 || f >= 1) { n += (f>1 ? 1 : -1); f*=(f>1?0.5:2) };
f *= 2
while ( f != 0 ) { s = s (f > 1); f = (f - (f>=1))*2 }
print s "E" n
}'
0.110011110110001000111010010100010011000010010011000E3
评论
0赞
Cat
10/24/2022
谢谢,我已经找到了答案。无论如何,谢谢
0赞
RARE Kpop Manifesto
10/19/2022
#2
mawk
有一个未记录的后门,您可以直接提取完整的 IEEE 754 十六进制(而不仅仅是格式):"%A"
mawk 'BEGIN { CONVFMT = "IEEE754-%lX"
print ( exp(_^_) "")
print (atan2(_<_,--_) "") }'
IEEE754 - 400 5BF0A8B145769 # Euler''s E 2.71828... IEEE754 - 400 921FB54442D18 # PI 3.14159…
您还可以从下一节中看到符号位或指数位如何翻转 ,以及当我将其按另一个缩小时:pi/4
-pi/4
2 ^ 1015
IEEE754 - BFE 921FB54442D18 # negative IEEE754 - 3FE 921FB54442D18 # "non-negative" IEEE754 - 007 921FB54442D18
当它进入非规范化区域时,所有十六进制数字一致降档:
print (atan2(_^=_<_,_)*2^-1021 "")
print (atan2(_^=_<_,_)*2^-1029 "")
IEEE754 - 001 921FB54442D18 IEEE754 - 000 01921FB54442D
评论
0赞
Cat
10/24/2022
谢谢,我已经找到了答案。无论如何,谢谢
下一个:匹配两个数字的正则表达式
评论
-