如何在不使用 Java 中的 Integer.toBinaryString 的情况下将双数或浮点数或负数转换为二进制?

How do I convert double or float or negative number to binary without using Integer.toBinaryString in java?

提问人:Cat 提问时间:10/16/2022 最后编辑:Attila TCat 更新时间:10/19/2022 访问量:101

问:

我找到了这种方法,它对字节/短/整/长类型的正数非常有效,但如果我键入浮点数/双精度数或负数,则无法正常工作。我之所以需要在不使用的情况下完成它,是因为我在学校有这个任务,我们的老师说我们不能使用它。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;
}
Java 浮点 二进制 负数

评论

0赞 Cat 10/16/2022
我不明白,我应该在哪里添加减号的结果和位置..?我也用 math.abs 尝试过这个,但也没有用。就像,如果我键入 -128000,它应该转换为 11111111 11111110 00001100 00000000,根据 Integer.toBinaryString,但相反,这个程序会像正数一样转换它,我得到11111010000000000
0赞 Old Dog Programmer 10/16/2022
如果要转换的数字为负数,结果应该是什么样子?您是要打印带有符号,还是希望结果采用二补码形式?-
1赞 Cat 10/16/2022
我希望它与Integer.toBinaryString结果相同
0赞 Old Dog Programmer 10/16/2022
那么,二的补码。是否允许使用按位运算符?是否允许使用按位方法?
0赞 Cat 10/16/2022
不知道它是什么,所以我想我可以

答:

0赞 kvantour 10/18/2022 #1

注意:下面的代码是用伪语言编写的

假设我们对 f 的二进制表示感兴趣,那么有几个步骤需要完成。假设它包含二进制字符串并初始化为“0”。s

  1. 确定标志
    s=" 0."; 
    if (f < 0) { s = "-0."; f = -f  } 
    
  2. 确定指数:搜索 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) }
    
  3. 确定数字 我们假设停止条件是,因为每个IEEE编号在数字上都是一个有限数,它是2的幂的线性组合。
    f *= 2
    while (f != 0) {
       if (f > 0) {s += "1" : f -= 1 } 
       else { s += "0" }
       f *= 2
    }
    
    f != 0
  4. 打印值
    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/42 ^ 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
谢谢,我已经找到了答案。无论如何,谢谢