C語言 兩道位操作的面試題

來源:互聯網
上載者:User

1、把一個32位的數按位反轉,就是第32位轉到第1位,第31位轉到第2位…………
什麼樣的演算法最節省效率?
參考http://www.yuanma.org/data/2007/0723/article_2763.htm
unsignedint bit_reverse(unsignedint n)
{
       n
=((n >> 1)& 0x55555555)|((n << 1)& 0xaaaaaaaa);
       n
=((n >> 2)& 0x33333333)|((n << 2)& 0xcccccccc);
       n
=((n >> 4)& 0x0f0f0f0f)|((n << 4)& 0xf0f0f0f0);
       n
=((n >> 8)& 0x00ff00ff)|((n << 8)& 0xff00ff00);
       n
=((n >> 16)& 0x0000ffff)|((n << 16)& 0xffff0000);
       return
n;
}
第一行代碼為奇偶位相互交換;第二行為以兩位為一單元,奇偶單元進行交換;第三行為以四位為一單元,奇偶單元進行交換;第四行為以八位為一單元,奇偶單元進行交換;最後一行為以十六位為一單元,奇偶單元進行交換。至此,32位反轉完成,演算法結束。
 
上述奇偶、2、4、8、16的交換方法可以演變有四種實現形式,本質一樣,可以都先移後取、都先取後移以及一個先移後取、另一個先取後移
 
受上面程式啟發,可以考慮16、8、4、2、奇偶來實現交換,即先將左右整體換邊,再處理局部換邊的問題,
 
將32位分成兩個16位的箭頭,折半互換有兩種實現方式:
一,先把每個箭頭換向,整體分別左移或右移16位,即可;問題是每個箭頭怎麼換向?問題又成了16位元怎麼折半互換,再分成兩個8位的箭頭,如上方法,依次實現,最後就是奇偶互換了,可以形成遞迴演算法;或者將1的思路反相考慮,直接奇偶互換,2、2互換,4、4互換,8、8互換,16、16互換即可,是一種反向推算條件的方法,對應於原作者的方法。
 
二,先把兩個箭頭的位置互換,即16、16互換;再將每個箭頭分成兩份,兩組8、8互換,依次類推,4組4、4互換,8組2、2互換,16組奇偶互換,實現方法和思考方法一致。
 
第二種方法更容易想到,借鑒了二分尋找的思想,逐層分半。
 
如果為面試,要是你很快寫出上述演算法,一種說明你是天才,另外一種說明你以前做過此題,那麼考察就沒有意義了,只能說明你準備充分,不能說明你有多牛;當然天才是很少的了,他立刻隨便再出個題,如果你也能很快搞定,那可能真說明你是天才,可是這樣的機率太小了;咱們還是老實點吧,肯定不能說咱們做過,又不能說自己是天才,那要想裝牛B怎麼辦呢?



2,、用最小的程式碼完成統計32位int資料中1的個數(不用移位方法)data為所要統計對象,i為結果:while(data!=0){     data &= data -1;     i++;}原理:位元與上自身減一的數都會使自身的最低的1所在位歸零!真是巧妙呀。
ps:若是要求以最快速度的話,我想應該是查表法吧,不知道對不對,還請高手指正!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.