2017-08-11 39 views
-2

我遇到了這個程序,將小數轉換成它們在C中的二進制等價物。我不明白printf語句在這個程序中是如何工作的。請解釋這個程序是如何工作的?

int main() 
{ 
    int N; 
    scanf("%d", &N); // Enter decimal equivalent here 
    for(int j = floor(log2(N)); j >= 0; j--){ 
     printf("%d", (N >> j) & 1); 
    } 
} 
+2

我可以告訴你,它正在以一種非常糟糕的方式做它正在做的事情。所以你最好問問怎麼做,而不是去嘗試去理解一些奇怪的事情。 –

+3

你知道,如果你只是用手寫出來和谷歌什麼運營商>>和&做,並通過for循環邏輯,你會明白。 –

+0

我對&1感到困惑,任何東西和1本身都是 –

回答

1

讓我們舉個例子,通過這個問題來獲得。假設你輸入N = 65。它的二進制表示是-1000001.當你的代碼通過它時,j將從floor開始(log2(65)),這是6.所以,給定的循環將運行7次,這意味着將打印出7個數字(這符合65的二進制表示有7位數的事實)。

循環內部 - 數字每次向右移動j位。當1000001向右移6位時,它變爲0000001.如果移位5,則爲0000010,依此類推。它下降到原始數字0位的移位。當這些移位的數字中的每一個都是1時,只有最低有效位(最右邊的位)保持不變。並且這個數字可以是0或者1.

如果你會注意到每個右移都將數字除以2.所以當1000001移動1使得0100000時,它是32的二進制表示,它實際上C是65/2。畢竟,這是某人手動計算數字的二進制表示的方式。除以2的每個除法給出一個表示的數字(從結尾開始),並且該數字是0或1. &有助於獲得0或1.

最後,65變爲1000001

+0

感謝您的答案,但我不明白實際轉換(小數到二進制)在這個程序中發生的地方?你寫了「循環內 - 數字每次向右移動j位」。你在這個聲明中說的是哪一個數字?如果這裏的數字與轉換髮生的十進制數字是二進制等價的? – sportmew

+0

好的。現在我懂了。無需回覆我先前的評論。你的解釋清楚了一切。 – sportmew

1

它是什麼做的是:

  • 發現數量最多j這樣2^j <= N
  • j個位(從右邊開始計數)開始,並向右移動...
    • 斬掉當前所選位右側的所有位
    • 斬去所有位的當前選擇位
    • 左側打印剩下的一個位的值
+0

謝謝。現在我明白這個代碼裏發生了什麼。另一個精心設計的答案使一切變得清晰。 – sportmew