2013-03-10 76 views
-6

有人能向我解釋什麼標誌和位域。他們似乎是相互關聯的,或者說我得到了錯誤的想法。我有點把握位,他們做了什麼件,是,但我想,讓他們充分解釋,我真的不能找到任何好的教程或指南。什麼是標誌和位域?

我會很感激,如果有人可以提供有關如何使用它們等一些很好的例子......比如我看到這些類型的表達式所有的時間,我不完全理解他們。只是他們是某種邏輯運營商或某種東西

VARIABLE1 | VARIABLE2 

在此先感謝!一個整數值的

+0

http://programmers.stackexchange.com/? – 2013-03-10 00:57:53

+4

你讀過關於這個主題的維基百科文章嗎?請參閱http://en.wikipedia.org/wiki/Bit_field – 2013-03-10 01:00:39

回答

0

的位可被用作的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 
} 
0

「標誌」是一個概念性的對象,可以設置或不設置,但不是C++語言的一部分。

位字段是用於使用位集合,可能無法彌補的可尋址對象的語言結構。一個位的字段是一個 - 通常非常好 - 實現一個標誌的方式。

0

A「bifield」是一組在一個「字」一個或多個位(即,一個說int,或longchar)被一起存儲在一個變量中。

例如,你可以有「無‘點’和/或‘條’上的一些動物,也可以有‘無,短,中,長’尾巴。

所以,我們需要兩個位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) 
{ 
    ... 
} 

這是真的只是收拾幾件事情變成一個變量的簡單方法。

2

簡介位運算可以在這裏找到: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等),等等。然後您只需要這一個變量來傳遞不同的函數,並且可以使用您定義的位掩碼進行測試,而不必跟蹤潛在的數十個變量。

希望能夠揭示一下按位運算的這種應用。