Я учусь в колледже на курсах по операционным системам, и мы учимся, как преобразовывать двоичные числа в шестнадцатеричные, десятичные в шестнадцатеричные и т. Д., И сегодня мы только что узнали, как числа со знаком / без знака хранятся в памяти с помощью дополнения к двум (~ число +1)
У нас есть пара упражнений на бумаге, и я хотел бы иметь возможность проверить свои ответы перед тем, как передать свою работу учителю. Я написал программу на C ++ для первых нескольких упражнений, но теперь я застрял в том, как я могу проверить свой ответ со следующей проблемой:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
и мы должны показать , двоичное представление в памяти о a
, b
и c
.
Я сделал это на бумаге, и это дает мне следующие результаты (все двоичные представления в памяти чисел после дополнения двух):
a = 00111010 (это символ, поэтому 1 байт)
b = 00001000 (это символ, поэтому 1 байт)
c = 11111110 11000101 (это короткий, поэтому 2 байта)
Есть ли способ проверить мой ответ? Есть ли в C ++ стандартный способ показать двоичное представление в памяти числа или мне нужно самому кодировать каждый шаг (вычислить дополнение к двум, а затем преобразовать в двоичный код)? Я знаю, что последнее не займет много времени, но мне любопытно, есть ли стандартный способ сделать это.
источник
std::hex
) манипулятор - я оставлю это в качестве упражнения для вас, чтобы поработать над остальными ...Ответы:
Возможно, самый простой способ - создать
std::bitset
представляющее значение, а затем передать его вcout
.источник
std::bitset
!+1
от меня.bitset
конструктора @Jesse: интерпретируется как значение без знака, которое работает так же, как дополнение к двум. Строго говоря, C ++ не гарантирует арифметику с двумя дополнениями, а также-58 >> 3
операция в вашем примере не определена.Используйте преобразование на лету в
std::bitset
. Нет временных переменных, циклов, функций, макросов.Live On Coliru
Печать:
источник
x
использования:std::cout << std::bitset<8*sizeof(x)>(x)
.Если вы хотите отобразить битовое представление любого объекта, а не просто целое число, не забудьте сначала переосмыслить его как массив символов, затем вы можете распечатать содержимое этого массива в шестнадцатеричном или даже двоичном виде (с помощью набора битов):
Обратите внимание , что большинство распространенных систем прямой порядок байтов, поэтому выход
show_binrep(c)
является не 1111111 011000101 вы ожидаете, потому что это не так, как она хранится в памяти. Если вы ищете представление значения в двоичном виде, то простоcout << bitset<16>(c)
работает.источник
Нет, нет
std::bin
, вродеstd::hex
илиstd::dec
, но нетрудно вывести двоичный номер самостоятельно:Вы выводите самый левый бит, маскируя все остальные, сдвигая влево, и повторяете это для всех битов, которые у вас есть.
(Количество битов в типе равно
sizeof(T) * CHAR_BIT
.)источник
Подобно тому, что уже опубликовано, просто используя бит-сдвиг и маску, чтобы получить бит; пригодный для любого типа, являющийся шаблоном (
только не уверенный, если есть стандартный способ получить число бит в 1 байте, я использовал 8 здесь).источник
CHAR_BIT
.Многоразовая функция:
Использование:
Это работает со всеми видами целых чисел.
источник
источник
int t = pow(2, num_of_bits - 1);
?Используя старую версию C ++, вы можете использовать этот фрагмент:
источник
Использование ответов std :: bitset и удобных шаблонов:
Используя это так:
Генерирует вывод:
источник
Вот верный способ получить двоичное представление числа:
источник
Это то, что вы ищете?
источник
</argument>
, Действительно, мы взрослые, да? Я почти проверил возраст всего, что прокомментировал здесь, чтобы убедиться, что всем было по 13 лет.