2011-06-20 6 views
2

私は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

著者が** that ** enumの定義を示していれば、C++についての本を読んでいない、C++/CLIに関する本を読んでいる。 – ildjarn

+0

@ildjarn私が読んでいる本は次のとおりです:http://www.amazon.com/Ivor-Hortons-Beginning-Visual-2008/dp/0470225904/ref=sr_1_1?つまり、UTF8&qid = 1308601643&sr = 8-1 – Cobold

+0

私はその本を読んでいませんが、C++とC++/CLIの両方をカバーすると思われるので、少なくともあなたは** C++ではありません。 – ildjarn

答えて

4

あなたは出力

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; 
} 

System::Convert::ToStringになります。あなたがしたい場合:現状:1011

編集空ゼロ」パディングはちょうどん:その後、ちょうどその結果を分割し、スペース/ hypheを挿入

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

をあなたはそれがバイトサイズの部分に分割したい場合は、 ns。

+0

なぜそれらの0はすべてあるのですか? – Cobold

+0

@Coboldビット1(Ready)、2(ReadMode)、4(EOF)の整数があるためです。先行ゼロが空であるのと同じ理由は、ビット3が空であるのと同じ理由です。値はありません。 –

4

まず、値を整数にキャストします。私はC++/CLIでこれを行う最良の方法についてはわかりませんが、Cでは(int)statusとなります。

C++では値をバイナリで表示する方法はありませんが、16進数で表示できます。ここではそのための文です:

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

出力は0000000bする必要があります。

+0

これはちょうどbを示しています。どのように0も表示できますか? – Cobold

+0

@Cobold: '{0:x8} 'を使用します。省略して申し訳ありません。仕様はhttp://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#XFormatString –

2

まず、著者はstatusは3つの列挙型とORされているのでは

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

はただ、一緒にこれらの三つの値を追加して、あなたは切り捨てることができます(約1011著者会談を取得します値ということを知っていますすべての先行ゼロ)。ビット単位の演算を今までに行っていない場合は、パイプ|を使用して値に対してビット単位のOR演算を行います。

0001 
0010 
+1000 
----- 
=1011 

第二:あなたはこのような1あるすべての数字を足しC#は「オールドスクール」のようなバイナリ形式で印刷値が可能であれば私の以前のポスター、マーク身代金のように、私は実際には知りませんCではprintf()、C++ではstd::coutの機能が可能です。まず、BitConverterの.NETクラスを使用して、このようなバイナリ印刷機能を自分で作成することが考えられます。

希望に役立ちます。

EDIT:私が言及したBitConverterを使用してここに例が見つかりました。私は詳細にそれをチェックしますが、最初に、それは大丈夫らしい見えませんでした:http://www.eggheadcafe.com/software/aspnet/33292766/print-a-number-in-binary-format.aspx

+0

std :: coutで印刷する方法を知っていますか? – Cobold

+0

あなたは私の答えの下に@Brandon Moretzによって言及された試みをとらえてください。 'Convert :: ToString()'メソッドは行く方法です:) – PuerNoctis

+0

Oooops、申し訳ありませんが、私は実際に間違っています: 'printf'と' std :: cout'は16進表現とバイナリフォーマットをサポートしていないようです。私は本当にこの誤解を招くようなコメントをおかけして申し訳ありませんが、@BrandonMoretzに言及されている 'Convert :: ToString'は、あなたが使用しているC++/CLIのための最良の選択肢です。 – PuerNoctis

関連する問題