位運算
給出兩個整數 a 和 b, 求他們的和。
挑戰顯然你可以直接 return a + b,但是你是否可以挑戰一下不這樣做?(不使用+++等算數運算子) 分析
主要利用異或運算來完成,異或運算有乙個別名叫做:不進製加法,那麼a ^ b就是a和b相加之後,該進製的地方不進製的結果,然後下面考慮哪些地方要進製,自然是a和b裡都是1的地方, a & b就是a和b裡都是1的那些位置,a & b << 1 就是進製之後的結果。
所以:a + b = (a ^ b) + (a & b << 1),
令a' = a ^ b, b' = (a & b) << 1
可以知道,這個過程是在模擬加法的運算過程,進製不可能一直持續,所以b最終會變為0。因此重複做上述操作就可以 求得a + b的值。
class
solution
return a;}}
;
位運算求和
劍值offer上有道題很有趣,求兩數和,要求 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。一看不能直接加減,那就考慮二進位制之間的與或非移位操作。求和主要有兩點 1.每一位數字相加 2.考慮是否進製 主要步驟 二進位制各位數字相加,我們都知道運算規則是 0 0 0,1 1 0,...
位運算求相反數
n的相反數等於 n 1 對於取相反數之後不會產生溢位的情況都適用 對於正數的相反相反數來說,原碼就是除符號位變為1,其他不變,計算機中 對於乙個數字來說儲存的都是其補碼,負數的補碼為符號位不變其他位按位取反,然後將得到的結果 1 而 n 1的過程第一步就是將符號為變為1,變為其相反數原碼的情況,然後...
利用位運算求子集
紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...