显示对象中的位

时间:2011-06-20 19:38:27

标签: enums c++-cli

我正在读一本关于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 0000 1011',但是当我向控制台写状态时:

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

它显示:'当前状态:就绪,ReadMode,EOF'。他怎么知道它,如何将状态写入控制台以显示其二进制形式?

3 个答案:

答案 0 :(得分:4)

首先将值转换为整数。我不确定在C ++ / CLI中执行此操作的最佳方法,但在C中它将是(int)status

C ++没有提供以二进制形式显示值的方法,但它确实允许使用十六进制。以下是对此的陈述:

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

输出应为0000000b

答案 1 :(得分:4)

您应该查看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' ) );

如果你想将它分割成字节大小的片段,那么只需将结果拆分并插入空格/连字符。

答案 2 :(得分:2)

首先,作者知道因为status与三个枚举值进行“或”运算

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

只需将这三个值加在一起,您就会得到作者所说的1011(您可以截断所有前导零)。如果你现在没有进行按位操作:管道|用于对值进行按位OR运算。您只需添加1这样的所有数字:

 0001
 0010
+1000
-----
=1011

第二:像我之前的海报Mark Ransom一样,我实际上并不知道C#是否能够以二进制形式打印值,如C中的“oldschool”printf()函数或std::cout in C ++能够。首先想到的是使用.NET的BitConverter类并自己编写这样的二进制打印函数。

希望有所帮助。

编辑:使用我提到的BitConverter在这里找到一个例子。我没有详细检查,但首先看起来似乎没问题:http://www.eggheadcafe.com/software/aspnet/33292766/print-a-number-in-binary-format.aspx