Как я могу отобразить биты в неподписанном int без использования bitset? - PullRequest
0 голосов
/ 30 апреля 2019

В настоящее время я работаю над проектом для школы, охватывающим манипуляции с битами.Мы должны показать биты для целой переменной без знака и позволить пользователю манипулировать ими, включать и выключать их и сдвигать.У меня есть все функциональные возможности, за исключением отображения битов после того, как ими манипулируют.Нам НЕ разрешается использовать набор битов для отображения битов, и это приведет к значительному снижению качества.

Я пытался использовать операторы if, чтобы определить, включены ли биты или нет, но, похоже, это неработатьВсякий раз, когда бит изменяется, он просто печатает множество нулей и единиц.

std::cout << "Bits: ";

for (int i = sizeof(int)*8; i > 0; i--)
{

    if (a | (0 << i) == 1)
        std::cout << 1;
    if (a | (0 << i) == 0)
        std::cout << 0;

}

std::cout << std::endl << a;

Я ожидаю, что если я включу бит, то этот бит будет отображать 1 вместо 0, остальные биты остаются неизменными и по-прежнему отображают 0;вместо этого он печатает строку 1010101 длиной около половины консоли.

1 Ответ

0 голосов
/ 30 апреля 2019

Здесь есть пара проблем, и вы, возможно, захотите сделать подробный обзор манипулирования битами:

  • for (int i = sizeof(int)*8; i > 0; i--) должно быть for (int i = sizeof(int)*8 - 1; i >= 0; i--), потому что биты индексируются 0 (сдвиг1 слева 0 раз дает установленный бит в крайнем правом положении.)
  • Мы используем побитовое И (&) вместо побитового ИЛИ (|), чтобы проверить, установлен ли бит.Это связано с тем, что когда мы используем побитовое И с числом, для которого установлен только один бит, результатом будет маска с битом в позиции 1, находящаяся в том же состоянии, что и соответствующий бит в исходном номере (посколькуИ 1 - это сам), а все остальные биты - это 0 (поскольку все И 0 - это 0).
  • Нам нужна маска с 1 в позиции, которую мы хотим проверить, и 0 в другом месте, поэтому нам нужно 1 << i вместо 0 << i.
  • Если установлен проверяемый бит, мы получим число, для которого установлен один бит, но это не обязательно 1. Поэтому мы должны проверить, если результатне равен 0 вместо проверки того, равен ли он 1.
  • Оператор == имеет более высокий приоритет по сравнению с операторами | и &, поэтому скобкинужен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...