使用 x y x y 1 求平均數

2021-07-05 23:02:22 字數 1472 閱讀 8274

在乙個面試題裡見到這麼一道題:

下面的**:

int func (int x, int y)

當 x 為 729,y 為 271 時函式的返回值是多少?

思路最簡單也最直接的就是將 x 和 y 都先轉換為二進位制,然後老老實實的做按位與,按位異或等運算,最後得出結果。

在分析該表示式的實現思路之前,首先說明該表示式的作用就是求兩數的平均值。也就是說,像上面當 x 為 729,y 為 271 時函式的返回值是 500 。下面說明該表示式的思路。

我們先了解下面幾種情況:

1. 當兩個數所有為 1 和為 0 的位都相同時,這兩個數的平均值就是 (x & y) 。比如當 x 和 y 都等於 1100 時,x & y 的值也是 1100 ,我們也可以說此時求 x 和 y 的平均數可以用 (x & y) 來求得。

2. 當兩個數中的所有對應位有且只有乙個為 1 時,那麼這兩個數的平均值由 (x^y)>>1 表示式求得。比如當 x 為 101100 (十進位制 44),y 為 010010 (十進位制 18) 時,x ^ y 的值為 111110 ,然後再將 111110 向右移動 1 位後得 11111 (十進位制為 31),也就是 (44 + 18)/2 = 31 。

由上面的 情況1 和 情況2 我們知道,將它們兩者結合起來便可求得隨意兩個整數的平均值。下面以 x 等於 12, y 等於 24 為例說明:

x 的二進位制數字 1100 ,y 的二進位制數為 11000 。我們先將 x 和 y 做相與運算:

01100

11000        &

--------------

01000

實際上,像上面的運算,我們也可以直接看成是 情況1 中的運算,即相當於執行:01000 & 01000 ,最後值仍然是 01000 。

好,經過上面的與運算後,看起來是將 01100 和 11000 分別去掉了 01000 這部分,所以剩下來的就是 00100 和 10000 。當我們執行 x^y 時:

01100

11000  ^

-----------

10100

由上可見,異或的運算正好也是去掉了 01000 ,然後將剩下來的 00100 和 10000 這兩部分進行相加,所以求這兩部分的平均數只要向右移動 1 位即可。

綜上可得,我們求平均數的過程是先用與運算對數值做部分的提取,然後用異或並右移運算獲得餘下部分的平均值,因此這兩部分的平均值相加後就得出了原來兩數的平均值。實際上,這是乙個加法分解然後綜合的過程。如上面的 12 和 24,先做與運算,也就相當於從 12 和 24 裡分別先減去 4,剩下 8 和 20,再將這兩數相加得 28 (異或運算),然後再除以2(右移),結果為 14 。最後 14 + 4 等於 18 即得最後所要的結果。

儘管上面的過程看來上去實際用處不是很大,但如果是用在沒有乘除法指令的簡單微控制器系統,移位和邏輯運算操作就顯得很重要了。

使用 x y x y 1 求平均數

在乙個面試題裡見到這麼一道題 下面的 int func int x,int y 當 x 為 729,y 為 271 時函式的返回值是多少?思路最簡單也最直接的就是將 x 和 y 都先轉換為二進位制,然後老老實實的做按位與,按位異或等運算,最後得出結果。在分析該表示式的實現思路之前,首先說明該表示式的...

求平均數 x y x y 1 原理

x y x y 1 能求x與y的平均數,其原理1如下 設兩數如下 x y取出同為1的位,如下 00110 由此數一定小於等於原來如何乙個數,由此數加乙個數可以得到原來數,由此將原來的兩數相加變成4數相加,如下 相當於 00110乘以2 x y乘以2 而後兩數相加就是x y,相當於 x y乘以2 x ...

x y x y 1 求平均值

x y x y 1 把x和y裡對應的每一位 指二進位制位 都分成 三部分,每一部分 分別計算平均值,最後彙總 其中,第一部分 是x,y對應位都是1,用x y計算其平均值 第二部分 是x,y中對應位有且只有一位是1,用 x y 1計算其平均值 第二部分 是x,y中對應位均為0,無須計算。下圖詳細說明 ...