python 解析有符號的二進制

有符號二進制數(shù)到十進制的轉(zhuǎn)換

用下面的算法計算一個有符號二進制整數(shù)的十進制數(shù)值:

  • 如果最高位是 1,則該數(shù)是補碼。再次對其求補,得到其正數(shù)值。然后把這個數(shù)值看作是一個無符號二進制整數(shù),并求它的十進制數(shù)值。
  • 如果最高位是 0,就將其視為無符號二進制整數(shù),并轉(zhuǎn)換為十進制數(shù)。

例如,有符號二進制數(shù) 1111 0000 的最高有效位是 1,這意味著它是一個負數(shù),首先要求它的補碼,然后再將結(jié)果轉(zhuǎn)換為十進制。

過程如下所示:

初始值 11110000
第一步:按位取反 00001111
第二步:將上一步得到的結(jié)果加 1 00001111
+ 1
第三步:生成補碼 00010000
第四步:轉(zhuǎn)換為十進制 16

由于初始值(1111 0000)是負數(shù),因此其十進制數(shù)值為 -16。

源代碼

# encoding: utf-8
"""
@version: 1.0
@author: Jarrett
@file: bin2dec
@time: 2020/5/18 14:24
"""

class Bin2Dec():
    def __init__(self):
        pass

    def bin2dec(self, a):
        a_reverse = self.reverse(a)  # 取反
        a_add_1 = self.add_1(a_reverse)  # 二進制加1
        a_int = -int(a_add_1, 2)
        return a_int

    def bin2dec_auto(self, a):
        if a[0] == '1':  # 如果首位是1,復(fù)數(shù)轉(zhuǎn)換
            a_output = self.bin2dec(a)
        else:
            a_output = int(a, 2)
        return a_output

    def add_1(self, binary_inpute):  # 二進制編碼加1
        _, out = bin(int(binary_inpute, 2) + 1).split("b")
        return out

    def reverse(self, binary_inpute):  # 取反操作
        binary_out = list(binary_inpute)
        for epoch, i in enumerate(binary_out):
            if i == "0":
                binary_out[epoch] = "1"
            else:
                binary_out[epoch] = "0"
        return "".join(binary_out)

if __name__ == '__main__':
    bin2dec = Bin2Dec()
    a_origin = "000000000011010"
    a = bin2dec.bin2dec(a_origin)
    print(a) # -32742 這是將上面的字符串強行轉(zhuǎn)換

    b_rev = bin2dec.reverse(a_origin)
    print(b_rev) # 111111111100101
    b = bin2dec.bin2dec(b_rev)
    print(b)    # -27

    c = bin2dec.bin2dec_auto(a_origin)
    print(c)    # 26

    d = bin2dec.bin2dec_auto(b_rev)
    print(d)    # -27

使用方法

bin2dec = Bin2Dec()
a = '11110000'
a_int = bin2dec.bin2dec_auto(a)

out: a = -16

參考鏈接1:http://c.biancheng.net/view/3318.html
參考鏈接2:https://blog.csdn.net/aabbcccddd01/article/details/93649525

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容