Почему программа выводит 24
?
Вы правы, 12
is 0b1100
в своем двоичном представлении. Это, как говорится, также является 0b001100
, если вы хотите. В этом случае бит-сдвиг влево дает вам 0b011000
, то есть 24
. Исключение составляет программа.
Где эта остановка?
Вы используете переменную int
. Его размер обычно составляет 4 байта (32 бита) при 32-битном таргетинге. Тем не менее, это плохая идея полагаться на размер int
. Используйте stdint.h, когда вам нужны переменные размера.
Слово предупреждения для bitshifting над подписанными типов
Использование оператора <<
Bitshift над отрицательными значениями не определено поведение. Поведение >>
по отрицательным значениям определяется реализацией. В вашем случае я бы рекомендовал использовать unsigned int
(или просто unsigned
, что и то же), потому что подписано int
.
Как получить результат, за исключением?
Если вы знаете размер (в битах) номера, который вводит пользователь, вы можете использовать битовую маску, используя оператор &
(побитовый AND). например
result = (number << 1) & 0b1111; // 0xF would also do the same
Пожалуйста, ознакомьтесь с документом о том, как отправить вопрос в stackoverflow. – user3286661
Вы можете использовать std :: bitset, чтобы легко обрабатывать манипуляции на уровне бит. – seccpur
'int' составляет не менее 16 бит (в частности, он должен быть достаточно большим, чтобы удерживать любое целое число в диапазонах -32,767..32,767 \ [signed \] или 0..65,535 \ [unsigned \], что требует минимум из 16 бит), но может быть больше (обычно, но не всегда, 32 бита). Таким образом, число, которое сдвигается на стандартных платформах, обычно не '0b1100', а' 0b0000000000001100'. Если вы хотите обработать номер в виде 4-значного двоичного числа, вы должны использовать 'std :: bitset', чтобы дать вам более тонкое управление, как указано в @seccpur выше, или маску, как указывают и иллюстрируют ответы. –