題目是這麼說的:
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)