有人能向我解釋什麼標誌和位域。他們似乎是相互關聯的,或者說我得到了錯誤的想法。我有點把握位,他們做了什麼件,是,但我想,讓他們充分解釋,我真的不能找到任何好的教程或指南。什麼是標誌和位域?
我會很感激,如果有人可以提供有關如何使用它們等一些很好的例子......比如我看到這些類型的表達式所有的時間,我不完全理解他們。只是他們是某種邏輯運營商或某種東西
VARIABLE1 | VARIABLE2
在此先感謝!一個整數值的
有人能向我解釋什麼標誌和位域。他們似乎是相互關聯的,或者說我得到了錯誤的想法。我有點把握位,他們做了什麼件,是,但我想,讓他們充分解釋,我真的不能找到任何好的教程或指南。什麼是標誌和位域?
我會很感激,如果有人可以提供有關如何使用它們等一些很好的例子......比如我看到這些類型的表達式所有的時間,我不完全理解他們。只是他們是某種邏輯運營商或某種東西
VARIABLE1 | VARIABLE2
在此先感謝!一個整數值的
的位可被用作的bool。
http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx
請與|
與&
檢索。
enum { ENHANCED_AUDIO = 1, BIG_SPEAKERS = 2, LONG_ANTENNA = 4};
foo(HAS_CAR | HAS_SHOE); // equiv to foo(3);
void processExtraFeatures(flags) {
BOOLEAN enhancedAudio = flags & ENHANCED_AUDIO; // true
BOOLEAN bigSpeakers = flags & BIG_SPEAKERS; // true
BOOLEAN longAntenna = flags & LONG_ANTENNA; // false
}
「標誌」是一個概念性的對象,可以設置或不設置,但不是C++語言的一部分。
位字段是用於使用位集合,可能無法彌補的可尋址對象的語言結構。一個位的字段是一個 - 通常非常好 - 實現一個標誌的方式。
A「bifield」是一組在一個「字」一個或多個位(即,一個說int
,或long
char
)被一起存儲在一個變量中。
例如,你可以有「無‘點’和/或‘條’上的一些動物,也可以有‘無,短,中,長’尾巴。
所以,我們需要兩個位reprent尾巴的長度:
enum tail
{
tail_none = 0,
tail_short = 1,
tail_medium = 2,
tail_long = 3
};
我們接着存儲這些作爲位,在「屬性」:
enum bits_shifts
{
tail_shift = 0, // Uses bits 0..1
spots_shift = 2, // Uses bit 2
stripes_shift = 3
};
enum bits_counts
{
tail_bits = 2, // Uses bits 0..1
spots_bits = 1, // Uses bit 2
stripes_bits = 1
};
現在我們假裝我們已經從一些輸入tail_size和has_stripes進賬, 具有_spots變量。
int attributes;
attributes = tail_length << tail_shift;
if (has_spots)
{
attributes |= 1 << spots_shift;
}
if (has_stripes)
{
attributes |= 1 << stripes_shift;
}
後來我們想圖什麼屬性是:
switch((attributes >> tail_shift) & (1 << tail_bits)-1))
{
case tail_none:
cout << "no tail";
break;
case tail_short:
cout << "short tail";
break;
case tail_medium:
cout << "medium tail";
break;
case tail_short:
cout << "long tail";
break;
}
if (attributes & (1 << stripes_shift))
{
cout << "has stripes";
}
if (attributes & (1 << spots_shift))
{
cout << "has spots";
}
現在,我們已經存儲所有這一切在一個整數,然後再「釣出來」。
當然你也可以做這樣的事情太:
enum bitfields
{
has_widget1 = 1,
has_widget2 = 2,
has_widget3 = 4,
has_widget4 = 8,
has_widget5 = 16,
...
has_widget25 = 16777216,
...
}
int widgets = has_widget1 | has_widget5;
...
if (widgets & has_widget1)
{
...
}
這是真的只是收拾幾件事情變成一個變量的簡單方法。
簡介位運算可以在這裏找到:http://www.codeproject.com/Articles/2247/An-introduction-to-bitwise-operators
,也適用於標誌,位運算是有利的,他們都非常快,節省空間。您可以通過使用互斥的位來在單個變量內存儲對象的許多不同狀態。即
0001 // property 1 (== 1, 0x01)
0010 // property 2 (== 2, 0x02)
0100 // property 3 (== 4, 0x04)
1000 // property 4 (== 8, 0x08)
這些可以表示對象的四個不同屬性(這些是「掩碼」)。我們可以通過使用or
屬性添加到對象的標記狀態:
short objState = 0; // initialize to 0
objState |= 0010;
這通過增加財產2以上objState「或」 -ing 0010與0000,造成0010如果再加上另一個標誌/屬性像所以:
objState |= 0100;
我們最終objState = 0110
現在我們可以檢查是否該對象具有爲屬性2設定的標記,例如,通過使用and
:
if (objState & 0010) // do something
and
爲1當且僅當兩個位均爲1,所以如果位2爲1,則上述操作保證爲非零。
所以,正如我所說的,這種處理對象的屬性/標誌的優點是速度和效率。可以這樣想:您可以使用此方法將一組屬性存儲在單個變量中。例如,你有一個文件類型,並且你希望使用位掩碼(我將使用音頻文件)跟蹤屬性。也許位0 - 3可以存儲文件的位深度,位4 - 7可以存儲文件類型(Wav,Aif等),等等。然後您只需要這一個變量來傳遞不同的函數,並且可以使用您定義的位掩碼進行測試,而不必跟蹤潛在的數十個變量。
希望能夠揭示一下按位運算的這種應用。
http://programmers.stackexchange.com/? – 2013-03-10 00:57:53
你讀過關於這個主題的維基百科文章嗎?請參閱http://en.wikipedia.org/wiki/Bit_field – 2013-03-10 01:00:39