2011-06-20 104 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

如果作者顯示**那個枚舉定義,那麼你沒有閱讀關於C++的書,你正在閱讀一本關於C++/CLI的書 - 這是兩種完全不同的語言。 – ildjarn

+0

@ildjarn這是我正在閱讀的書:http://www.amazon.com/Ivor-Hortons-Beginning-Visual-2008/dp/0470225904/ref=sr_1_1?ie = UTF8&qid = 1308601643&sr = 8-1 – Cobold

+0

我還沒有讀過那本書,但是鑑於它似乎涵蓋了C++和C++/CLI,至少**你應該知道你的代碼所示不是C++。 – ildjarn

回答

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')); 

如果你想讓它分割成字節大小塊,然後就分頭行動的結果和插入空隙/ hyphe納秒。

+0

順便說一句,爲什麼有這些0? – Cobold

+0

@Cobold,因爲您有一個整數,指定了位1(Ready),2(ReadMode)和4(EOF)。前導零是空的原因是相同的,原因是位3是空的,沒有值。 –

4

第一件事將是將該值轉換爲整數。我不確定在C++/CLI中執行此操作的最佳方法,但在C中,它將是(int)status

C++不提供以二進制顯示值的方法,但它確實允許使用十六進制。這裏的說法是:

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正在與三個枚舉值進行或運算

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

只需添加這三個值加在一起,你會得到1011約(你可以截斷筆者會談所有前導零)。如果您現在沒有按位操作:管道|用於對值進行按位或運算。你剛纔加起來是1這樣所有的數字:

0001 
0010 
+1000 
----- 
=1011 

二:像我以前的海報,馬克贖金,我真的不知道,如果C#能夠打印值的二進制形式,如「老校友」 C中的printf()函數或C++中的std::cout都能夠。首先想到的是使用.NET的BitConverter類,並自己編寫這樣的二進制打印功能。

希望有所幫助。

編輯:在這裏找到一個例子,使用我提到的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'似乎也只支持十六進制表示,沒有二進制格式。對於這個誤導評論,我真的很抱歉,但@BrandonMoretz提到的'Convert :: ToString'仍然是您正在使用的C++/CLI的最佳選擇。 – PuerNoctis