(x&y)+((x^y)>>1)(面試寶典)

int f(int x,int y)

{

        return (x&y)+((x^y)>>1);

};

f(729,271)=500.

解答:

x&y是取相同的位與,這個結果是x和y相同位,x^y是取x和y的不同位的和,右移1位,相當於除以2.所以結果是求x和y的平均數。


如果二進制不易理解,那我們看看十進制的情況。

假如將&操作和^操作推廣到是取十進制位中來,即如果&操作對應的兩個位上的數相同,則結果爲兩個數中的一個,否則爲0.如2&2=2,2&3=0;如果^操作則留下兩個數不同的那些位,234^136=204+106;

(以下的&和^都是上面假設推廣到十進制中的運算符,而非二進制中的運算符)

現在如果設x=234,y=136,x&y=30,x^y=204+106,(x&y)+((x^y)/2)=30+(204+106)/2=185.

(     (234+136) / 2 = ( 204+30+106+30) / 2  = 30 + (204+106) / 2  ).

發佈了41 篇原創文章 · 獲贊 30 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章