簡體   English   中英

理解一些C代碼

[英]understanding some C code

快問。 我從未有過C的經歷。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int n, x;
   printf( "How many disks? " );
   scanf( "%d", &n );
   printf("\n");
   for (x=1; x < (1 << n); x++)
      printf( "move from tower %i to tower %i.\n",(x&x-1)%3, ((x|x-1)+1)%3 );
    return 0;
}

這是河內的迭代塔。 (x&x-1)和(x | x-1)+1的含義是什么意思? 我認為%正在做模數。 和%i是一種在C中打印出整數的方法嗎?

謝謝

  1. &運算符,與*運算符1一樣,可以用於兩種不同的事情,具體取決於它是用作二元 運算符還是一元運算符。
    1. 一元&喜歡&var需要的地址var 這是將其傳遞給scanf所必需的。
    2. Binary & like var & var是一個按位AND,就像第2項一樣。
      • 請注意,間距無關緊要。 重要的是,如果&兩側都有操作數。 所以& var仍然是一元的&var &var仍然是二元&
  2. (x&x-1)xx-1進行按位AND運算。
  3. (x|x-1)xx-1進行按位OR運算。
  4. %表示模數。
  5. 1 << n正在向左移動1到左數n
  6. 你看到的%i作為printf的第一個參數是格式符號,指定下一個參數是一個int ,這樣printf就可以正確打印它(因為它不知道它本身是什么類型,所以你有告訴它)。 它與模數無關。 你可以在這里看到一個非常深入的printf定義: http ://pubs.opengroup.org/onlinepubs/9699919799/(謝謝pmg)
    • 如果%i在字符串之外,則它將位於某個其他操作數的左側,並且是平均模數。
    • 字符串中的%i本身並不意味着什么。 它只對printf因為printf特別對待它。 它搜索它獲取的字符串是否出現%formatformat是格式,而不是單詞“格式”),並根據遇到的格式執行某些操作。

1 *運算符還有兩個不同的版本:一元版本和二進制版本。 一元版本表示指針間接,二進制版本表示乘法。

(x&x-1)和(x | x-1)+1的含義是什么意思?

(x&x-1)相當於(x & (x-1)) &按位AND運算符。 類似地,對於第二個例子,其中| 按位OR運算符。

我認為%正在做模數。

是的

和%i是一種在C中打印出整數的方法嗎?

是的

printf是格式化的輸出函數,其中%i表示參數是整數。 例如, 這里可以獲得更多信息。

%運算符確實是模數。 &是按位AND,和| 是按位OR。

這條線:

for (x=1; x < (1 << n); x++)

將x初始化為1並重復/迭代直到x <(1左移n)。 左移基本上移動了1個左n個二進制空間的二進制表示。 因此,在左移1后,0001將為0010 - 這類似於乘以2 ^ n。 然后x增加1(x ++)。 最終,x的增加最終會導致循環因x <(1 << n)條件而終止。

(x&x-1)%3

說“值的剩余部分x(二進制和)值x-1除以3.因此,如果x是4,我們使用的是4位數字(愚蠢,我知道 - 但它顯示了這一點):

0100 &
0011
_______
0000        (binary and means both spots being added are 1, none are here).

= 0
0/3 = 0 R 0 - no remainder here, so print 0.

下一個聲明:

(x|x-1)+1)%3

表示x(二進制或)x-1,其中1加到該值。 整個總和由3修改,再次將其跳過3並取余數,所以如果x再次為4並且我們使用4位整數:

0100 |
0011
_______
0111    (Binary or means either binary number has a 1 in that slot).

= 4 + 2 + 1 = 7 --> 7 mod 3 = 7 / 3 --> 2 R 1, print  remainder of 1 here.

printf允許格式化打印出可變長度的參數列表,這些參數可以是表達式,所以這里它將打印:

move from tower 0 to tower 1 <new line>

用我們的答案替換%i。

&| 是按位運算符(分別是AND和OR運算符)。

  0101 (decimal 5)
& 0011 (decimal 3)
------
= 0001 (decimal 1)


  0101 (decimal 5)
| 0011 (decimal 3)
------
= 0111 (decimal 7)

由於減法運算符的優先級高於按位運算符的優先級:

(x&x-1) = (x&(x-1)) 
(x|x-1) = (x|(x-1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM