我遇到了這個程序,將小數轉換成它們在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);
}
}
我遇到了這個程序,將小數轉換成它們在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);
}
}
讓我們舉個例子,通過這個問題來獲得。假設你輸入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
它是什麼做的是:
j
這樣2^j <= N
j
個位(從右邊開始計數)開始,並向右移動...
謝謝。現在我明白這個代碼裏發生了什麼。另一個精心設計的答案使一切變得清晰。 – sportmew
我可以告訴你,它正在以一種非常糟糕的方式做它正在做的事情。所以你最好問問怎麼做,而不是去嘗試去理解一些奇怪的事情。 –
你知道,如果你只是用手寫出來和谷歌什麼運營商>>和&做,並通過for循環邏輯,你會明白。 –
我對&1感到困惑,任何東西和1本身都是 –