好玩的位运算4:如果用二进制表示小数

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好玩的位运算4:如果用二进制表示小数相关的知识,希望对你有一定的参考价值。

算法的一个方面就是将原来我们习以为常的东西用算法给一行行实现了,二进制小数与十进制小数之间的转换就是一个例子。题目要求:给定一个0到1之间的实数(如0.625),类型为double,请你打印它的二进制表示(例如0.625对应的就是0.101)。如果无法精确用32位二进制表示就打印Error。

算法测试不是真的要在工程里用,因此题目会做很多简化,例如这里没有让考虑3.24这种的,也没让考虑负数的问题,就写一个简单的转换。

我们先看一下怎么转换,例如0.6,将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,知道小数部分为0。 
特殊情况: 小数部分出现循环,无法停止,则用有限的二进制位无法准确表示一个小数,这也是在编程语言中表示小数会出现误差的原因,一般只要满足一定的精度就够了。具体过程:

0.6 * 2 = 1.2 ——————- 1 
0.2 * 2 = 0.4 ——————- 0 
0.4 * 2 = 0.8 ——————- 0 
0.8 * 2 = 1.6 ——————- 1 
0.6 * 2 = 1.2 ——————- 1 

所以对于上面的实现也是一样,如果增加一倍之后超过1了就保留一个1,如果没超过1就增加一个0.当然这里还要注意超过1时要及时将超过的1去掉,代码就是:

   public static void main(String[] args) 
        double num = 0.625;
        System.out.println(change(num));
    

    public static String change(double num) 
        StringBuilder sb = new StringBuilder("0.");
        while (num > 0) 
            double r = num * 2;
            if (r >= 1) 
                sb.append("1");
                //消除整数部分
                num = r - 1;

             else 
                sb.append("0");
                num=r;
            
            if (sb.length() > 34) 
                System.out.println("Error");
                return null;
            
        
        return sb.toString();
    

以上是关于好玩的位运算4:如果用二进制表示小数的主要内容,如果未能解决你的问题,请参考以下文章

ACM中的位运算技巧

位运算和enum中的位运算

Luabit的位运算

好玩的位运算2:用一条语句判断一个整数是不是2的整数次方

好玩的位运算1:找数组中找成对和不成对

11 二进制中1的个数+二进制补充知识点