一道普通的面試題

2021-06-02 20:27:44 字數 1585 閱讀 9188

第一次面試的時候,被問到這麼一道題:

計算機中資料是以二進位制來儲存的,如何先將乙個數的二進位制形式逆序,然後再把新得到的數用整數形式輸出?

比如13表示為 1101, 逆序后位 1011,用整數形式輸出結果為11。

當時自己想的很複雜, 主要考慮了兩種情況,一種是不考慮原始資料前面隱藏的0,從第一位不為0的數開始算起,進行逆序;第二種情況是考慮全部32位,前面隱藏的0在逆序後,全部位於新數的後面。當時自己也沒問清楚,就隨便寫了一種,現在想想,還有可能需要考慮符號位的問題,不過涉及到符號位,更需要考慮計算機中負數的儲存方式,不能單單以直觀方式來考慮了。

先寫出前面兩種的解決方案:

第一種,不考慮原始資料前面隱藏的0,這種情況較為一般,方法也有很多種,不過最多的就是將每位儲存至陣列中,然後逆序在變成十進位制數,

#include #include #include void main()
這種方法使用了庫函式,最為簡便,如果沒有特殊要求不能使用庫函式,則該方法最為便捷。

void main()

cout《這種方法通過靈活的移位操作,來達到目的。先讓s左移,來獲取為最後一位騰出空間,再通過或運算來得到當前a最後一位的值,直到a全部移位完成。需要注意的是,如果

s |= (0x01 & a);

s<<=1;

這兩句執行順序這樣的話,雖然也能保證儲存取到a當前的最後一位,不過會導致s比期望的結果多向左移動一位。

#includeint main()

while(num>1);

str[i]=num+'0';

num=0;

for(j=0;j<=i;j++)

printf("%d\n",num);

return 0;

}

這個方法是最為普通的方法,通過儲存每一位,來達到目的。

值得一提的是,有一種將數值快速逆序的方法,是乙個網友提供的方法,如下示例中,將1進行了逆序:

#include #include #include int main()

else

}printf("%x\n", rev);

return 0;

}

這種方法通過判斷原始資料每一位的值來獲取每一次移位得到的資料。注意的是,如果為當前位為1,加1補齊結果。如果為0,不需要補齊。因為判斷n的當前位始終為結果數值的最後移位,通過加0加1來與判斷的當前位保持一致。

在第二種情況中,下面的方法很好的提供了解決方案:

int = 31, i32output = 0;

int i32value;

scanf("%d", & i32value);

while (i--)

printf("%d\n", i32output);

這種方法也很簡單,通過對1移位或是補0來保證結果的一致性,需要注意的是,因為資料是以32位儲存的,移動的時候只需移動31位就可以,如果移動32位,會導致溢位。

在第三種情況中,情況也應該是大致類似,不過首先應考慮補碼的儲存,確保符號位。我對這個也不是很了解,還要多進行學習。

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...