Преобразование базы 10 в базу 2, программирование на C

#c #binary #codeblocks

#c #двоичный #кодовые блоки

Вопрос:

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

Вот фрагмент кода:

 int n, c, k;

scanf("%d",amp;n);

for(c = 31;c >= 0;c--)
{
    k = n >> c;

    if(k amp; 1)
        printf("1");
    else
        printf("0");
}

return 0;
  

это я получил с одного веб-сайта, и оно преобразует базу в двоичную.

Мой вопрос в том, где у меня есть оператор if amp; else, почему существует if (k amp; 1) printf («1»)?? Я думал, что k может быть как 1, так и 0, и если я использую (k amp; 1), есть два варианта, такие как (0 amp; 1) = 0 и (1 amp; 1) = 1. Может ли кто-нибудь, пожалуйста, объяснить мне это? Большое вам спасибо.

Комментарии:

1. Это просто сокращение от if ((k amp; 1) != 0) .

2. попробуйте: if (123) printf(«yes»); затем попробуйте 0 вместо 123.

3. @OliCharlesworth Стоит отметить, что оператор if OP на самом деле не является сокращением для того, что вы описали. Эти два утверждения, безусловно, эквивалентны, но то, что вы говорите, эквивалентно выражению if (true) is shorthand для if (true != 0) , которое, хотя и эквивалентно утверждениям, не делает первое сокращением для последнего. Инструкция if (true) не была создана как сокращение для последней инструкции выше.

4. (кстати, эту ветвь можно заменить более компактной и безветвленной putchar('0' (k amp; 1)); )

5. @Wolfram: Да, это правда.

Ответ №1:

Выражение внутри оператора if всегда принимает значение true или false. В терминах целых чисел 0 означает false, а все ненулевое означает true. Когда у вас есть k amp; 1 , это означает, что если младший значащий бит k равен 1, то это выражение принимает значение 1 и, следовательно, считается истинным. Если младший значащий бит k равен 0, то выражение принимает значение 0 и, следовательно, считается ложным.

Комментарии:

1. 1 Хороший ответ: Примечание: Неизменное «first», как и в «first bit of k «, представляет некоторую двусмысленность. Предложите «младший значащий бит k «.

Ответ №2:

Одна вещь, которая помогла мне, когда я начинал, заключалась в том, чтобы «вручную» несколько раз пробежаться по коду с помощью ручки и бумаги.

Чтобы привести пример, давайте рассмотрим ваш цикл (но работайте с 8-разрядными целыми числами, а не с 32-разрядными целыми числами):

 for(c = 7; c >= 0; c--)
{
    k = n >> c;
    if(k amp; 1)
        printf("1");
    else
        printf("0");
}
  

Я предполагаю, что другой код в вашем примере не изменится. Кроме того, предположим, что пользователь ввел 218 (или 11011010 в двоичном формате).

первая итерация:

 n is 218, c is 7.
we do a right shift 7 (n >> c) which makes k 00000001
we do a bit-wise `and' of k and 1 (K amp; 1), which is 1 or true
we print "1"
  

вторая итерация:

 n is 218, c is 6.
we do a right shift 6 (n >> c) which makes k 00000011
we do a bit-wise `and' of k and 1 (k amp; 1), which is 1 or true
we print "1"
  

третья итерация:

 n is 218, c is 5.
we do a right shift 5 (n >> c) which makes k = 00000110
we do a bit-wise `and' of k and 1 (kamp;1), which is 0 or false
we print "0"
  

и так далее…

Итак, вы правы, что k может быть либо 0, либо 1, однако он принимает только одно из этих значений каждый раз в цикле.

Наконец, на случай, если вам неясно, как работает побитовое «и», он просматривает n-й бит в обоих числах, и если они совпадают, он устанавливает n-й бит результата равным единице (1), в противном случае он устанавливает результат равным нулю (0). Рассмотрим побитовое значение и из 218 с 15:

 218  is 11011010     e.g. third bit from right is zero
 15  is 00001111     e.g. third bit from right is one
-----------------
  amp;     00001010     e.g. third bit from right is zero