最近在複習計算機組成原理,感覺對於位運算的理解還是有待加強。便找了幾道題練手。其中對於平均值的位運算問題,在網上找到的**解讀較少,斗膽自己解讀一下。
題目:利用位運算計算(a+b)/2
int mean_value(int a,int b)
**較為簡單,其核心**僅僅一句:
(a&b) + ((a^b) >> 1
在此之前,我們首先需要理解的是,二進位制中的加法運算過程。
與十進位制加法相似,我們很容易可以將它劃分為兩部分(不考慮進製的加法過程和進製部分)
例:1.在不考慮進製的條件下,兩個數相同位數相加的結果如下表所示:11
0101
0110
00我們可以看到,他相當於對兩個數按位異或的結果。
2.在只考慮進製的條件下,兩個數相同位數相加的結果如下表所示:11
1100
0100
00我們可以看到,兩個數相加的結果相當於對兩個數按位與的結果。
由於在進製的時候,其進製後的結果應該是在下一位,所以我們對按位與後的結果左移一位
所以,我們的兩數相加可以表示為 a+b = (a ^ b)+((a & b) << 1);
這時,利用位運算求平均值的方法就呼之欲出了。只要對於(a+b)/2就好了,而/2正號可以使用位運算中的右移來表示(>>1),
最後結果就相當於 (a+b)/2 = ((a ^ b)+((a & b) << 1)) >> 1;利用基本的算數性質,把左移右移抵消之後為
(a+b)/2 = ((
(a ^ b)>>1)+(a & b) );
利用位運算求子集
紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...
位運算求和
劍值offer上有道題很有趣,求兩數和,要求 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。一看不能直接加減,那就考慮二進位制之間的與或非移位操作。求和主要有兩點 1.每一位數字相加 2.考慮是否進製 主要步驟 二進位制各位數字相加,我們都知道運算規則是 0 0 0,1 1 0,...
位運算求a b
位運算 給出兩個整數 a 和 b,求他們的和。挑戰顯然你可以直接 return a b,但是你是否可以挑戰一下不這樣做?不使用 等算數運算子 分析 主要利用異或運算來完成,異或運算有乙個別名叫做 不進製加法,那麼a b就是a和b相加之後,該進製的地方不進製的結果,然後下面考慮哪些地方要進製,自然是a...