2015-06-22 2 views
-5
#define MACRO(num, str) {\ 
      printf("%d", num);\ 
      printf(" is");\ 
      printf(" %s number", str);\ 
      printf("\n");\ 
      } 

int main(void) 
{ 
    int num; 

    printf("Enter a number: "); 
    scanf("%d", &num); 

    if (num & 1) 
    { 
     MACRO(num, "Odd"); 
    } 
    else 
    { 
     MACRO(num, "Even"); 
    } 
    return 0; 
} 

Пожалуйста, объясните, приведенный выше код (если другое условие/и как он печатает «Odd» и «Even»)Как этот код печатает нечетные и четные?

+3

В двоичном представлении нечетное число имеет младший значащий бит, но четные числа не потому, что (частота 2). '& 1' проверяет этот бит и берет' Odd' путь, когда бит установлен и 'равно 'в противном случае. Для 'MACRO' это простая замена текста, вы можете попробовать вручную. –

+2

Я голосую, чтобы закрыть этот вопрос не по теме, потому что это не показывает никаких исследований. –

ответ

1

В двоичном любые числа LSB (младший бит) является set или 1 означает, что число является odd, и младший бит 0 означает, что число является even.

Давайте посмотрим:

Decimal binary 
1   001 (odd) 
2   010 (even) 
3   011 (odd) 
4   100 (even) 
5   101 (odd) 

SO, следующая строка

num & 1 

будет производить либо 0 означает false или 1 означает true. Например, num = 5, следовательно:

5 & 1 (decimal) 
= 101 & 001 (binary) 
= 001 
= true (boolean) 

и if (num & 1) пойдут на true пути

MACRO(num, "Odd"); 

то macro будет заменить блок кода (например num по 5 и str по Odd).

Остальное зависит от вас. Приветствия.

Прочитано Macros и Bitwise operations in C для лучшего понимания.

2

определения ряда является «нечетным» или «даже» в приведенном ниже блоке логики ,

if (num & 1) 
... 
else 
... 

Если число нечетное, то binary representation будет иметь LSB набор 1. Таким образом, для нечетного числа

if (num & 1) 

будет оценивать, как TRUE.

Излишне указывать, что для четного числа такое же выражение будет оцениваться как FALSE.

[ПРИМЕЧАНИЕ: & здесь bitwise AND operator]

Теперь #define будучи preprocessor MACRO, то MACRO получит заменяется кодом блока макроопределения, печать желаемого результата.

1

if (num & 1) проверяет, является ли бит 0 числа равным 1. Каждое число с 1 в LSB является нечетным, каждое число с 0 равным 0.

Смежные вопросы