Логические, арифметические побитовые сдвиги - PullRequest
9 голосов
/ 13 сентября 2010

Стремясь прояснить что-то.

Насколько я понимаю, в отношении арифметических, логических побитовых сдвигов:

  1. << работают одинаково для обоих
  2. >> сдвиги отличаются тем, что логический сдвиг всегда заполняет байт 0, тогда как арифметическое смещение заполняет его знаковым битом.

Как я могу дифференцировать это, используя C?

Насколько я понимаю, действительные операторы одинаковы <<, >>

Как будет различаться команда:

int i=1;
printf ("%d\n", i >> 1); // logical shift

int j=1;
printf ("%d\n", j >> 1); // arithmetical shift

Пожалуйста, дайте мне знать,

1 Ответ

15 голосов
/ 13 сентября 2010

В случае неотрицательных чисел оба вида сдвига вправо одинаковы. Разница появляется только тогда, когда число для сдвига является отрицательным.

На самом деле стандарт C не указывает, когда >> должен выполнять логическое или арифметическое смещение, когда число отрицательное, но обычно он выполняет арифметическое смещение. Для выполнения логического сдвига число должно быть приведено к соответствующему типу без знака, , например :

int x = -2;
int y = x >> 1;    // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1;  // logical shift.
assert (z == 0x7FFFFFFF);
...