2013-12-13 3 views
-3
#include <stdio.h> 

void showbits(unsigned int x) 
{ 
    int i; 
    for(i=(sizeof(int)*8)-1; i>=0; i--) 
     (x&(1<<i))?putchar('1'):putchar('0'); 

    printf("\n"); 
} 

int main() 
{ 
    int j = 5225, m, n; 
    printf("The decimal %d is equal to binary - ", j); 
    /* assume we have a function that prints a binary string when given 
     a decimal integer 
    */ 
    showbits(j); 

    /* the loop for right shift operation */ 
    for (m = 0; m <= 5; m++) { 
     n = j >> m; 
     printf("%d right shift %d gives ", j, m); 
     showbits(n); 
    } 
    return 0; 
} 

Пожалуйста, объясните это подробно. Как почему это написано 1<<i вместо i>>1 ???
Как будет оцениваться условие для различных двоичных чисел ???Как оценивается эта программа?

+5

Не голосующий, но вам нужно больше узнать о проблеме, если вы хотите получить хороший ответ. Как вы думаете, что делает эта линия? Какой аспект не ясен? Можете ли вы предоставить [SSCCE] (http://sscce.org/), который показывает, что вы пробовали это и объяснили, какой аспект выхода вы не понимаете? –

+0

Хорошо, увидев это в контексте, я действительно должен согласиться с тем, что вы должны были поэкспериментировать, чтобы найти ответ самостоятельно. Если бы вы просто где-то прочитали это выражение, я понял, что неофит запутался в том, что он делает, но это рабочая программа, которую вы могли бы скомпилировать и изменить самостоятельно, чтобы понять ее поведение. -1. –

ответ

1

Выражение x << y означает «x», сдвинутое влево на y количество бит ». 1 << i будет возвращать целое число с битом i набора 1, а все остальные биты установлены в 0.

(i >> 1, с другой стороны, означает «сдвиг i вправо на один бит». Они не сравнимые операции на . Предположим, все i 5: 1 << i возвращает двоичное число 00100000, или 32, в то время как i >> 1 возвращает двоичное число 00000010 или 2.)

x & (1 << i) выполнит побитовой операции на x и 1 << i, который составляет проверяя, имеет ли x бит i set 1. Если это произойдет, это вернет положительное число; если нет, то он вернет 0.

Таким образом, общий результат этого выражения будет печатать персонажу 1 если x имеет битовую i установлен в 1, и печать 0, если он не делает.

0

Автор использовал тернарный оператор?: Вместо if-then-else, который будет более понятным.

1<<i 1-бит, смещенный в более высокое значение, пример i = 3: 0001b становится 1000b.

Этот сдвинутый бит набора затем используется для проверки бит в x в этом битовом положении.

Если этот бит в x равен 1, тогда оценивается первый putchar, иначе второй.

0

Почему это написано 1<<i вместо i>>1 ???

1 << i означает: Сдвиг бит влево 1 п раз. Таким образом, бит устанавливается в положение 0, а затем сдвигается, как часто он указывается значением i. Каждая последующая операция сдвига представляет собой умножение на 2.

i>>1 Это совсем другая операция, потому что он сдвигает биты права и операторы поменялись местами, так что это означает shift the value in i right for one position. Это существенно деление на 2.

Эти операции сканирования бит сдвига используются для некоторых конкретных вещей. Например, они использовались для быстрых мультипликаций/делений int для известных чисел, поскольку эти операции выполняются быстрее, чем выполнение операции FPU для значений размера регистра.

Другое использование состоит в том, чтобы хранить разные биты в одном байте и маскировать их, чтобы проверить, установлены ли они, или если вы хотите их установить. В более старые времена это часто использовалось для сохранения памяти (когда память была небольшой и дорогой).Он по-прежнему необходим на аппаратных устройствах, потому что там часто есть аппаратные регистры, сигнализирующие различные состояния в отдельных битах.

0

Он просто выводит битпаттерс x на экран, но в инвертированном порядке это означает, что, например, x равно char и x == 5, тогда он печатает: 10100000 (вместо 00000101). Это делается 1<<i, а не 1>>i, чтобы не устанавливать i в самый старший бит, в зависимости от типа x.

Но вы могли бы написать:

(x & (1<<(sizeof(x)*8-1-i))) ? putchar('1') : putchar('0'); 

Тогда вы бы его в правильном порядке.

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