Reverse Bits以及補碼原碼和python的相關操作

題目是這麼說的:

Reverse bits of a given 32 bits unsigned integer.

意思是反轉一個unsigned的整形,之前我沒看到這個地方,所以走了一些彎路,這個題目在leetcode是屬於簡單類型的。

python來做是非常簡單的

class Solution:
    def reverseBits(self, n: int) -> int:
        value = bin(n)[2:]
        value = "0"*(32-len(value)) + value
        value = value[::-1]
        return int(value,2)

但是我爲啥會把這個單獨拿出來說一下呢,主要是另外一個問題,如果問題不是unsigned int,是int呢?比如-1,-1在計算機中標識補碼呢,這裏也順便說一下,原碼,反碼,補碼

原碼:第一位0,1表示正負,剩下的數字純二級制標識,帶來的問題是計算機對0,1處理不好

反碼:正整數和原碼一樣,負數在原碼的基礎上,符號位不變,各位取反,帶來的問題是+0和-0的問題

補碼:正整數和原碼一樣,負數在反碼的基礎上符號位不變,各位取反,然後+1

在python裏面沒有找到將int轉爲2進制的函數(這裏是指補碼也要支持),另外將2進制轉爲int也沒有找到(第一位1的補碼方式需要支持)

因此就需要計算幾個特別的問題

1、取反

2、二級制加1

3、轉爲對應負數

如下圖

def reverseBits(n):
    if n>=0:
        value = bin(n)[2:]
        value = "0"*(32-len(value)) + value
        value = value[::-1]
        return value
    else:
        value = bin(-n)[2:]
        value =  "0" * (32 - len(value)) + value
        # 取反
        value = list(value)
        for i in xrange(len(value)):
            if value[i] == "1":
                value[i] = "0"
            else:
                value[i] = "1"
        # 加一
        tmp = 1
        for i in xrange(len(value) - 1,-1,-1):
            if tmp == 1 and value[i] == "1":
                value[i] = "0"
                tmp = 1
            else:
                value[i] = str(int(value[i]) + tmp)
                break
        # 反轉
        value = value[::-1]
        if value[0] == "1":#負數
            value = value[1:]
            tmp = 1
            for i in xrange(len(value) - 1, -1, -1):
                if tmp == 1 and value[i] == "0":
                    value[i] = "1"
                    tmp = 1
                else:
                    value[i] = str(int(value[i]) - tmp)
                    break
            return -int("".join(value),2)
        else:
            return int("".join(value),2)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章