2013-02-24 110 views

回答

4

這是位或。在這種情況下,編寫位掩碼很有用。這些標誌定義了一個設置了一位的數字,當你將它們放在一起時,最終會得到一個兩位都置位的數字。

例如: 我不知道這些標誌的精確值,但讓我們想象它們是:

#define GL_COLOR_BUFFER_BIT 0x01 
#define GL_DEPTH_BUFFER_BIT 0x08 

如果您在二進制寫那些了,你會得到:

GL_COLOR_BUFFER_BIT = 00000001 
GL_DEPTH_BUFFER_BIT = 00001000 

如果你按位或那些在一起,您可以設置輸出爲1位,如果該位在任一GL_COLOR_BUFFER_BITORGL_DEPTH_BUFFER_BIT,所以設置:

GL_COLOR_BUFFER_BIT = 00000001 
GL_DEPTH_BUFFER_BIT = 00001000 
        = 00001001 

所以你最終得到的數字是0x09。

你打電話給你檢查通過了號碼的功能,並在此基礎上位設置,它知道你傳遞什麼標誌。

+0

你能在更詳細一點解釋究竟是什麼意思? – user2101672 2013-02-24 13:28:52

+0

感謝您的解釋! – user2101672 2013-02-24 13:34:35

0

這是一個按位或操作。按位或以下面顯示的方式工作:

讓我們假設您有2個字節a,b。

a = 0 0 1 1 0 1 0 1 

b = 1 0 1 1 0 0 0 0 

按位運算符在bit level上工作。會發生什麼,它會依次執行每一個操作並對其執行操作。如果至少有一個(或兩個)位是1,則結果字節中的相應位也將是1。如果他們都是0,那麼結果位也將是0

所以按位或a和b將做到這一點:

a = 0 0 1 1 0 1 0 1 

b = 1 0 1 1 0 0 0 0 

c = 1 0 1 1 0 1 0 1 

首先位0和1有一個1在C位等等將是1. 秒位0和0,所以下一個結果位將是0. 第三位都是1。至少存在一個1,因此c中的下一位將是1 ...,依此類推。

希望它爲你清除它。

PS。我在這裏使用了虛擬位,並且決不對應於GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT使用的實際值。

大多數按位運算符用於對值執行掩碼或將兩個值組合在一起。

|將二者結合起來一起 &將強制口罩

讓我們假設您將得到一個數值,你想使它看起來像這樣(我們將使用&執行這一面罩)。

0 0 0 1 1 1 1 0 

0將對應於不應該有值的位置,1對應於您感興趣並想要提取的位。

a = 1 0 1 0 0 1 1 0 
mask = 0 0 0 1 1 1 1 0 

現在在所有位都高於0將被丟棄,結果將在這些位0,因爲和&你需要兩個位是1秒,以導致位1

在哪裏你的掩碼中有1,這就是結果中可能出現1的地方。因此,在每個位上使用&時,您最終會得到此值。

result = 0 0 0 0 0 1 1 0 

如果你仔細看看結果中的4位,它們與掩碼中的1s位置相同,只是從a中移出。所以它真的做了什麼,刪除了掩碼有0的位,並用1保留。

0

這取決於你正在使用的語言,但在很多這是bitwise or。這通常用於將幾個編碼爲一位的標誌傳遞給一個函數。例如,如果你有兩個標誌

const char FLAG_1 = 0x01; 
const char FLAG_2 = 0x02; 

然後FLAG_1 | FLAG_20x03。對於按位不相交的位,這相當於加法,起初可能會造成混淆。在通話中的位進行邏輯或運算

func(FLAG_1 | FLAG_2) // set both FLAG_1 and FLAG_2 

功能func然後可以單獨使用bitwise and測試位:

void func(char flags) { 
    if(flag & FLAG_1) { // test for FLAG_1 
    } 
    if(flag & FLAG_1) { // test for FLAG_2 
    } 
}