1. 程式人生 > >十進位制小數分數與二進位制的轉換

十進位制小數分數與二進位制的轉換

十進位制分數轉換為二進位制數
使用短除法。

例如將十進位制分數11/28轉換為二進位制數,過程如下:

1、首先將分子分母分別轉換成二進位制 
(11)10=(1011)2 
(28)10=(11100)2 

2、使用短除,借位時是借2,商只能是0或1 
            0.0110010 
        ———————— 
 11100 ) 1011.00 
          111 00 
         ————————— 
          100 000 
           11 100 
         ————————— 
          100 000 
           11 100 
         ————————— 
              100 
              ... 
     所以:11/28=1011/11100=0.01100100...



十進位制小數轉換為二進位制小數


十進位制數的整數位是二進位制數的整數位,十進位制數的小數位是二進位制數的小數位。兩部分分開轉換。

整數部分 除以2取餘,逆序排列。
小數部分 乘 2 取整,順序排列。

例如轉換十進位制小數11.4,過程如下。

計算整數部分,11轉換為二進位制位1011:

               餘 數
  +                ^
2 |     1 1     1  | 逆
  +-+------+       | 序
  2 |     5     1  | 寫
    +-+----+       | 出
    2 |   2     0  |
      +-+--+       |
      2 | 1     1  |
        +--+       +
          0



計算小數部分0.4,首先將小數部分一直乘2,積的整數部分順序取出:

0.4*2=0.8      取0      |                               
0.8*2=1.6      取1      |  順
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      |
0.2*2=0.4      取0      |

可以看出0110是迴圈,因此小數部分的二進位制是

0.01100110……(迴圈0110)



最終結果是整數位和小數位合併1101111.01100110……(2)

二進位制小數轉換為十進位制小數
使用按權展開求和法,小數點左邊是2的正數次方,從0開始;小數點右邊是2的負數次方,從-1開始。 

例如將101.111(2)轉換成十進位制數

                1*(2^2)+0*(2^1)+1*(2^0)       # 整數部分   + 1*(2^(-1))+1*(2^(-2))+1*(2^(-3))       # 小數部分                                               =5.875


附 python 版十進位制與二進位制轉換
# coding=UTF-8
from decimal import Decimal


def dec2bin(n, bit=20):
    """
    n, integer or float to convert
    bit, bits after point
    return binary, string
    """
    negative = False
    if n < 0:
        negative = True
        n *= -1

    integer = int(n)
    decimal = n - integer
    binary = ""

    if n == 0:
        return "0"

    while integer != 0:
        result = int(integer % 2)
        integer /= 2
        binary = str(result) + binary

    if decimal != 0:
        i = 0
        decimal_bin = ""  # binary decimal after convert
        while decimal != 0 and i < bit:
            result = int(decimal * 2)
            decimal = decimal * 2 - result
            decimal_bin += str(result)
            i += 1
        binary = binary + '.' + decimal_bin

    if negative:
        binary = '-' + binary

    return binary

def bin2dec(n):
    """
    n binary, support point
    return integer or float
    """
    negative = False
    if n < 0:
        negative = True
        n *= -1

    integer = int(n)
    decimal = n - integer

    if integer != 0:
        integer_str = str(integer)
        length = len(integer_str)

        integer = 0
        for i in xrange(0, length):
            bit = int(integer_str[i])
            if bit == 1:
                integer += 2 ** (length - i - 1)
            elif bit != 0:
                print "invalid integer:" + str(n)

    if decimal != 0:
        decimal_str = str(decimal)[2:] # skip "0."
        length = len(decimal_str)

        decimal = 0
        for i in xrange(0, length):
            bit = int(decimal_str[i])
            if bit == 1:
                decimal += 2 ** (-1 * (i + 1))
            elif bit != 0:
                print "invalid decimal:" + str(n)

    result = integer + decimal

    if negative:
        result *= -1

    return result


def testcases():
    for pair in [(125, '1111101'),
                 (1.3, '1.01001100110011001100'),
                 (2.5, '10.1'),
                 (0, '0'),
                 (-1, '-1'),
                 (0.5, '.1')]:
        assert pair[1] == dec2bin(pair[0])

    for pair in [(-1001.1100, -9.75),
                 (-1101, -13),
                 (111.111, 7.875),
                 (0.1101, 0.8125),
                 (1001, 9),
                 (0, 0),
                 (0.1, 0.5)]:
        assert pair[1] == bin2dec(pair[0])

    print "all test case success"


if __name__ == "__main__":
    # testcases()
    print bin2dec(0.5)



參考:

http://blog.csdn.net/caoguo_app_android/article/details/9955743