我正在读一本关于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'。他怎么知道它,如何将状态写入控制台以显示其二进制形式?
答案 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