Странный вывод при суммировании 1 << 2 и 1 << 3 в C ++ - PullRequest
8 голосов
/ 12 октября 2019

Так что я просто пытался немного манипулировать битами в C ++. Вот что я попробовал:

int a = 1<<2;
cout<<a;

Это дает вывод как 4.

int a = 1<<3;
cout<<a;

Это дает вывод как 8

Но когда яdo:

int a = 1<<2 + 1<<3;
cout<<a;

Это дает вывод как 64. Почему так?

Я также пытался:

int a = 1<<2;
int b = 1<<3;
cout<<a + b;

, который дает вывод как 12, как и ожидалось.

Ответы [ 3 ]

7 голосов
/ 12 октября 2019

Это потому, что сложение имеет более высокий приоритет оператора, чем битовое смещение. Другими словами, ваш второй пример эквивалентен 1 << (2 + 1) << 3

Кроме того, поскольку битовое смещение ассоциировано слева, оно совпадает с (1 << (2 + 1)) << 3. Это упрощает до 8 << 3, что составляет 64.

6 голосов
/ 12 октября 2019

Это примерно приоритет оператора

+ имеет более высокий приоритет, чем операторы сдвига, поэтому 1<<2 + 1<<3 выполняется как 1 << (2 + 1) << 3, что аналогично 1 << 6 == 64 (так как << is ассоциативно слева , как вы можете видеть в таблице приоритетов по ссылке выше)

Вот почему cout<<a + b; работает, потому что он анализируется как cout<<(a + b);, в противном случае вы 'Я получу некоторые ошибки, такие как "невозможно добавить номер в поток"

3 голосов
/ 12 октября 2019

Оператор + имеет более высокий приоритет, чем оператор <<, поэтому вот эта строка оценивается:

int a = (1<<(2 + 1))<<3;

Вы должны сгруппировать его следующим образом в скобках:

int a = (1<<2) + (1<<3);
...