位運算求和

2021-10-04 18:08:53 字數 1233 閱讀 1385

劍值offer上有道題很有趣,求兩數和,要求:

「寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。」

一看不能直接加減,那就考慮二進位制之間的與或非移位操作。

求和主要有兩點:

1.每一位數字相加

2.考慮是否進製

主要步驟:

二進位制各位數字相加,我們都知道運算規則是:

0+0=0,1+1=0,1+0=1,這不就是異或操作嘛!!

所以,第一步,num1和num2作異或,得到sum

考慮進製問題,只有兩個1相加的時候有進製:0+0=0,0+1=0,1+1=1,超巧,就是相與操作。

這裡需要注意:如果相與結果是0,說明兩個數的各位都不一樣,沒有1+1=0的情況,也就是沒有進製,所以直接返回第一步得到的sum;如果相與結果不是0,就說明一定發生了進製!我們需要把相與結果左移一位,求得進製carry最後,sum+carry得到最後結果。(如果sum+carry也發生了進製,重複上面操作即可,直到carry=0000) ?‍

舉個例子:7+3=0111+0011

第一步:

sum=7^3=0111 ^ 0011=0100 (4)

carry=(7&3)<<1=0110 (6) 【7&3=0011 (0)】

第二步:

sum=4^6=0100 ^ 0110=0010 (2)

carry=(4&6)<<1=1000 (8) 【4&6=0100 (4)】

第三步:

sum=2^8=0010 ^ 1000=1010 (10)

carry=(2&8)<<1=0000 (0) 【2&8=0000 (0)】

至此,carry=0,無進製發生,直接返回sum即可。

翻譯成**:

public

static

intadd

(int num1,

int num2)

return num1;

}

2023年4月4日,清明節。漫長的三個月,世界從來沒有超級英雄,平凡人挺身而出,比肩神明。感謝挺身而出的醫護工作者,緬懷那些被寫進歷史的英雄和同胞們。???

沒有那麼多來日方長,有些人道別後就再也不會遇見,所以好好珍惜現在的生活、家人、朋友。♥

位運算求a b

位運算 給出兩個整數 a 和 b,求他們的和。挑戰顯然你可以直接 return a b,但是你是否可以挑戰一下不這樣做?不使用 等算數運算子 分析 主要利用異或運算來完成,異或運算有乙個別名叫做 不進製加法,那麼a b就是a和b相加之後,該進製的地方不進製的結果,然後下面考慮哪些地方要進製,自然是a...

位運算求相反數

n的相反數等於 n 1 對於取相反數之後不會產生溢位的情況都適用 對於正數的相反相反數來說,原碼就是除符號位變為1,其他不變,計算機中 對於乙個數字來說儲存的都是其補碼,負數的補碼為符號位不變其他位按位取反,然後將得到的結果 1 而 n 1的過程第一步就是將符號為變為1,變為其相反數原碼的情況,然後...

利用位運算求子集

紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...