日期:2014-05-20  浏览次数:20796 次

如何在屏幕上显示二进制的float和double?
格式:  
float:   s     x*8     m*23
double:   s     x*11   m*52
s是符号位,x是指数位,m是尾数位
恳请指教..

------解决方案--------------------
对float来说,把数字跟0x8000做按位与操作,即“&”,如果结果等于0x8000,就输出1,否则输出0,然后把数字左移一位,再跟0x8000做按位与操作, 同样如果结果等于0x8000,就在同一行输出1,否则输出0,循环32次。

对double来说,跟0x8000000做按位与,循环64次
------解决方案--------------------
转换 double 和 float 成为计算机内部的表示形式,在 Java 中主要用到 Double.doubleToLongBits(),即将一个 double 型的数转换成相同参数的 long 型数据,同理, Float.floatToIntBits() ,将一个 float 型的数转换成相同参数的 int 型数据。因为 long 与 double 和 int 与 float 在计算机内部所占用的位数是相同的。

根据 IEEE 754 的标准,浮点数的计算机内部表示除了符号位、指数位和尾数位之外,还有一个隐含位(不在计算机内部表示),这一位需要通过某些算法进行计算而得出的,这里就从略了。

public static void main(String[] args) {
  double pi = Math.PI;
  float s = 3.5454f;
  char[] d = toCharBits(Double.doubleToLongBits(pi), 64);
  System.out.print(pi + ": ");
  outputBits(d);    
  char[] f = toCharBits(Float.floatToIntBits(s), 32);
  System.out.print(s + ": ");
  outputBits(f);
}

// 在转换成二进制表示时,不采用 Long.toBinaryString() 和 Integer.toBinaryString(),
// 因为这两个方法会略去高位为“0”的数据,造成位数遗失,
// 为了避免出现位数不足的情况,实现将其转为字符数组,
// 以便于进行其他操作(比如:分解符号位、指数位、数值位和分析隐含位等操作)
public static char[] toCharBits(long num, int size) {
  char bits[] = new char[size];
  for (int i = size-1; i > = 0; --i) {
    bits[i] = (num & 1) == 0 ? '0 ' : '1 ';
    num > > > = 1;
  }
  return bits;
}

public static void outputBits(char[] charBits){
  for(int i = 0; i < charBits.length; i++){
    System.out.print(charBits[i]);
  }
  System.out.println();
}