Отображение битов в объектах - PullRequest
2 голосов
/ 20 июня 2011

Я читаю книгу о C ++.Автор показывает это перечисление:

[Flags] enum class FlagBits{ Ready = 1, ReadMode = 2, WriteMode = 4,
EOF = 8, Disabled = 16};
FlagBits status = FlagBits::Ready | FlagBits::ReadMode | FlagBits::EOF;

и говорит, что статус равен «0000 0000 0000 0000 0000 0000 1011», но когда я записываю статус в консоль:

Console::WriteLine(L”Current status: {0}”, status);

показывает: «Текущий статус: Готов, Режим чтения, EOF».Как он может знать это, и как я могу записать статус в консоль, чтобы показать ее двоичную форму?

Ответы [ 3 ]

4 голосов
/ 21 июня 2011

Вы должны посмотреть на System :: Convert :: ToString

int main(array<System::String ^> ^args)
{
    FlagBits status = FlagBits::Ready | FlagBits::ReadMode | FlagBits::EOF;

    Console::WriteLine(L"Current status: {0}", System::Convert::ToString( ( int ) status, 2 ) );
    Console::ReadLine();

    return 0;
}

Выход: текущий статус: 1011

Редактировать: если вы хотите пустое заполнение нуля, просто сделайте:

Console::WriteLine(L"Current status: {0}", System::Convert::ToString( ( int ) status, 2 )->PadLeft( 32, '0' ) );

Если вы хотите, чтобы он был сегментирован на куски размером в байт, просто разделите результат и вставьте пробел / дефис.

4 голосов
/ 20 июня 2011

Первым делом будет приведено значение к целому числу. Я не уверен, что лучший способ сделать это в C ++ / CLI, но в C это будет (int)status.

C ++ не предлагает способ отображения значения в двоичном формате, но допускает шестнадцатеричное. Вот заявление для этого:

Console::WriteLine(L"Current status: {0:x}", (int)status);

Вывод должен быть 0000000b.

2 голосов
/ 20 июня 2011

Во-первых, автору известно, что, поскольку status обрабатывается ИЛИ с тремя значениями перечисления

FlagBits::Ready = 1 // Binary 0001
FlagBits::ReadMode = 2 // Binary 0010
FlagBits::EOF = 8 // Binary 1000

Просто сложите эти три значения вместе, и вы получите 1011, о которых говорит авторо (вы можете обрезать все ведущие нули).Если вы уже не сталкивались с побитовыми операциями: канал | используется для выполнения побитовой операции ИЛИ со значениями.Вы просто складываете все цифры 1, например:

 0001
 0010
+1000
-----
=1011

Второе. Как и мой предыдущий постер, Марк Рэнсом, я на самом деле не знаю, способен ли C # печатать значения в двоичной форме, например«oldschool» printf() функция в C или std::cout в C ++ способны.Первой мыслью было бы использовать BitConverter класс .NET и самостоятельно написать такую ​​бинарную функцию печати. ​​

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: нашел пример здесь с использованием BitConverter Я упоминал.Я не проверял это подробно, но на первый взгляд все в порядке: http://www.eggheadcafe.com/software/aspnet/33292766/print-a-number-in-binary-format.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...