2016-09-20 4 views
-1
#include <iostream>  

int main() 
{ 
    using namespace std; 

    int number, result; 

    cout << "Enter a number: "; 
    cin >> number; 
    result = number << 1; 
    cout << "Result after bitshifting: " << result << endl; 
} 

Если пользователь вводит 12, программные выходы 24.смещение двоичных чисел в C++

В двоичном представлении 12 является 0b1100. Однако результат печати программы - 24 в десятичном формате, а не 8 (0b1000).

Почему это происходит? Как я могу получить результат, кроме меня?

+1

Пожалуйста, ознакомьтесь с документом о том, как отправить вопрос в stackoverflow. – user3286661

+0

Вы можете использовать std :: bitset, чтобы легко обрабатывать манипуляции на уровне бит. – seccpur

+0

'int' составляет не менее 16 бит (в частности, он должен быть достаточно большим, чтобы удерживать любое целое число в диапазонах -32,767..32,767 \ [signed \] или 0..65,535 \ [unsigned \], что требует минимум из 16 бит), но может быть больше (обычно, но не всегда, 32 бита). Таким образом, число, которое сдвигается на стандартных платформах, обычно не '0b1100', а' 0b0000000000001100'. Если вы хотите обработать номер в виде 4-значного двоичного числа, вы должны использовать 'std :: bitset', чтобы дать вам более тонкое управление, как указано в @seccpur выше, или маску, как указывают и иллюстрируют ответы. –

ответ

0

Почему программа выводит 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 
Смежные вопросы