昨天leetcode隨便找了一題準備日常開刷,題目是371.兩整數之和。題目大概要求是這樣的:不使用+和-的情況下,實現兩個整數的加法運算操作。有興趣請自行移步leetcode檢視這個題。
了解過計算機底層原理的應該知道,目前多數計算機是基於二進位制,對十進位制數字不能直接利用。即便是整體使用了二進位制,但計算機利用其位操作確實實現了十進位制的計算,所以演算法上可以用類似的原理進行模擬實現這題的需求。原理核心主要是:異或負責表示該位運算結果,兩個數相與後左移一位負責表示進製。當進製出現0之後就停止運算,輸出這時異或的值。
開始沒想太多,python寫出來大概就4行左右,指令碼執行後發現做運算的兩個數在同符號的情況下沒有問題,一旦兩個數字是異號的時候,程式就陷入了無限迴圈。
while b:
a, b = a ^ b, (a & b) << 1
return a
然後用列印輸出的方式檢視,發現數字已經十分龐大,然而還在翻倍變化,沒有停下來。
隨後思考了一番,想到了python數字的特點,宣告的時候沒有型別的定義,小數和整數有時候運算比較模糊,重要的是乙個整數超過表示範圍之後是可以變長的,變成大數運算,不會發生整數溢位。因為這個特性,所以數字位數不斷增多,按照演算法設計想要在最後異或出0是個難事。自動轉化這個現象很好驗證,int表示範圍內高次方或者大範圍階乘這樣的大數運算,可以看得出來這個特性。
既然數字都是按照補碼來的,可以通過與運算的方式人為地製造溢位,捨棄過大的那一部分。拿64位的python來說,每次異或運算或者與運算之後再和0xffffffff做一次與運算,從而保證資料的長度。最後注意一下數的大小,如果結果大於0x7fffffff,溢位了,還要和0xffffffff異或之後取反。
最後通過的**:
class solution:
def getsum(self, a, b):
""":type a: int
:type b: int
:rtype: int
"""while b:
a, b = (a ^ b) & 0xffffffff, ((a & b) << 1) & 0xffffffff
if a> 0x7fffffff:
a = ~(a ^ 0xffffffff)
return a
位運算要慎重,位運算要慎重,位運算要慎重! 整數轉化為字串和字串轉化為整數
整數轉化為字串 includeint main temp i 0 為什麼等於0就可以,因為將temp定義為字串陣列後,等號右邊的數相當於ascii碼值,0就相當於 0 如果寫為61,輸出就為 12345 printf s temp i i 1 while i 0 str j temp i str j...
字串轉化為整數
字串轉化為整數需要注意以下幾個問題 1.檢測非法輸入 2.空串 空指標 3.判斷數字的正負 4.處理數字的上下溢位。因為整數是有範圍的。include long long strtointcore const char digit,bool minus enum status int g nstat...
自動將jsx轉化為js
想將react應用到手頭上的專案練手,計畫希望可以把選單元件化,塞到主頁裡,從而變相的實現類似iframe的功能。然而在呼叫外部組建的時候出現了一系列問題,chrome甚至直接報錯了,一直無法解決,因此只有放棄使用 browser.min.js和jsxtransformer.js,準備自己採用rea...