蒟蒻版 利用位運算求平均值

2021-08-13 08:35:48 字數 814 閱讀 9119

最近在複習計算機組成原理,感覺對於位運算的理解還是有待加強。便找了幾道題練手。其中對於平均值的位運算問題,在網上找到的**解讀較少,斗膽自己解讀一下。

題目:利用位運算計算(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...