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

2021-06-09 16:28:48 字數 1057 閱讀 3066

1、把乙個32位的數按位反轉,就是第32位轉到第1位,第31位轉到第2位…………

什麼樣的演算法最節省效率?

參考unsignedint bit_reverse(unsignedint 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)

原理:二進位制數與上自身減一的數都會使自身的最低的1所在位歸零!真是巧妙呀。

ps:若是要求以最快速度的話,我想應該是查表法吧,不知道對不對,還請高手指正!

兩道SQL面試題

第一是.關於加班時間的問題 公司規定一周內最多只能加班和12個小時,多餘的要去掉,去掉的規則是 某天加班超過1h的才能去,而且是依次大致平均的去,最小單位是1小時 舉例 日期 工號 加班小時 周一 a001 6 周二 a001 2 週三 a001 1 周四 a001 5 周五 a001 7 共計加班...

兩道概率面試題

問題一 一根一公尺長的繩子,隨機斷成三段 求最短的一段的期望長度以及最長的一段的期望長度。分析 這道題實際是一道純粹的概率題,沒有太多技巧。自己有推導,但是概率論忘得差不多了,退出來的概率有點詭異 以後補充一下知識,再推導。先放一下 陳利人 給出的答案吧,比較簡略 有時間,我會補充乙個詳細的。問題二...

python面試題兩道

給乙個字串 123456789 在任意字元中間插入 四種運算子,使最後的計算結果等於50。例如你可以如此插入 1 56 7 89,使這個式子的最終結果等於50。輸出所有可能的式子結果。def make 50 self list str list self spr sum 50 for a in sp...