您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關LeetCode中如何不用加減乘除做加法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
寫一個函數,求兩個整數之和,要求在函數體內不得使用 “+”、“-”、“*”、“/” 四則運算符號。
與
可以用來計算進位, 而且顯然進位是要左移一位的異或
在兩個數字都為 1 或者都為 0 的情況下結果是 0, 否則結果是 1, 換言之
異或就是不帶進位的加法a+b
轉換成
((a&b)<<1)+(a^b)
, 雖然這里仍然有加號, 但是我們將其置為新的 a 和 b, 循環這個過程, 直到進位變成 0, 這樣最終異或結果就是兩者之和了&0xFFFFFFFF
, 正數仍為自身, 負數相當于 32 位補碼形式, 因為去掉了更高位上的 1), 然后利用上述結果求完之后, 如果結果是負數(
>0x7FFFFFFF
)的話再轉成正常的 python 負數表示方式(
~(a ^ 0xFFFFFFFF)
, 即先對低 32 位的取反, 更高位不變, 然后整體再取反, 從而將大于等于 32 位的數字重新轉成 1)class Solution:
def add(self, a: int, b: int) -> int:
# 32位數掩碼
mask = 0XFFFFFFFF
# 32位數的最大正數
posMx = 0X7FFFFFFF
while b != 0:
# a是不帶進位的和, 都要轉成32位整數
# b是進位, 都要轉成32位整數
# 循環直到進位為0, 那么a就是最終結果
smwithoutcarry = (a ^ b) & mask
carry = ((a & b) << 1) & mask
a, b = smwithoutcarry, carry
# 最終如果是32位負數的話, 需要將其轉回python正常的負數表示形式(高于32位的全是1, 而不是32位負數那樣更高位全為0), 做法是先對低 32 位的取反, 更高位不變, 然后整體再取反, 從而將大于等于 32 位的數字重新轉成 1
return a if a <= posMx else ~(a ^ mask)
class Solution {
public int add(int a, int b) {
while (b != 0)
{
int smwithoutcarry = a ^ b;
int carry = (a & b) << 1;
a = smwithoutcarry;
b = carry;
}
return a;
}
}
感謝各位的閱讀!關于“LeetCode中如何不用加減乘除做加法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。