2013-06-28 37 views
1

我已經使用了雙垂直「||」作爲布爾「或」運算符。並看到「|」是按位還是。「|」的確切功能是什麼? (垂直線)運算符時分隔參數

但是,由於我已經開始使用C++/cli,我注意到它用於使用單個參數來分隔函數中的標誌,這些參數似乎接受多個標誌。

一個例子是msdn的MessageBox()函數的例子。

int msgboxID = MessageBox(
     NULL, 
     (LPCWSTR)L"Resource not available\nDo you want to try again?", 
     (LPCWSTR)L"Account Details", 
     MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2 
    ); 

什麼是由「|」執行的操作。這裏?

什麼是「|」符號實際上叫? (就像「^」被稱爲脫字符號而不是我之前所知道的那樣,它是「顛倒的V」):D

我問的原因是我使用函數setWindowPos( ),它也接受標誌作爲參數。函數聲明如下:

BOOL WINAPI SetWindowPos(
    _In_  HWND hWnd, 
    _In_opt_ HWND hWndInsertAfter, 
    _In_  int X, 
    _In_  int Y, 
    _In_  int cx, 
    _In_  int cy, 
    _In_  UINT uFlags 
); 

而且我想知道是否可以像在MessageBox()中一樣組合標誌。

由於提前,

蓋伊

+0

這是邏輯或操作符。 –

+3

@TioPepe不,不是,它是_bitwise_或操作員! – zennehoy

+0

我的猜測是'MB_ICONWARNING','MB_CANCELTRYCONTINUE','MB_DEFBUTTON2'是在代碼的某處定義的宏,'|'是應用於這些宏的按位或運算符。 –

回答

4

|bitwise or運營商。當您將多個值組合起來產生不同效果時,它會按照您描述的方式使用。例如:

unsigned char MB_ICONWARNING = 1; //00000001 
unsigned char MB_CANCELTRYCONTINUE = (1 << 1); //00000010 
unsigned char MB_DEFBUTTON2 = (1 << 2); //00000100 

比方說,你想一個消息框具有這些值表示的所有屬性,你可以指定由bitwise or「荷蘭國際集團他們:

unsigned char combined = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2; //00000111 

被調用的函數就可以用它們來確定你與bitwise &運營商要求這樣

if(options & MB_ICONWARNING) 
{ 
    //Do MB_ICONWARNING 
} 

if(options & MB_CANCELTRYCONTINUE) 
{ 
    //Do MB_CANCELTRYCONTINUE 
} 

//etc... 

的選項。如果你有興趣,你可以閱讀更多關於Bit Fields

+0

好吧,謝謝我現在明白了。我簡單地認爲它不會是另一個「或」,因爲如果我說我在腦海中實際做的是什麼,我自然會將它描述爲「和」。 「我要設置的標誌是MB_ICONWARNING和MB_CANCELTRYCONTINUE和MB_DEFBUTTON2」。 只是其中一件事我發現混亂。正如對上述答案的評論所述,顯然天真的程序員使用+代替。我猜這是因爲它看起來更自然。不管怎樣,謝謝。 –

+0

是的,如果你的一個bitfield值超過了一個大的值並且跨越另一個值,那麼這個值就會讓你感到困擾。很高興我能幫上忙! –

5
unsigned int flag = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2 

這裏,|仍是按位或操作。它分離的參數是一些模式的宏。他們可能這樣定義的:

#define MB_ICONWARNING  1 
#define MB_CANCELTRYCONTINUE 2 
#define MB_DEFBUTTON2  4 

這樣的功能MessageBox內,選項可以檢查這樣的檢查,如果MB_ICONWARNING位上。

if (flag & MB_ICONWARNING) 
3

只要這些標誌可以通過其位被唯一標識(例如被兩個大國),那麼他們可以用位或操作員,你正在試圖做的組合。

考慮:

MB_ICONWARNING = 1; 
MB_CANCELTRYCONTINUE = 2; 

然後

flags = MB_ICONWARNING | MB_CANCELTRYCONTINUE; // == 3 

對證標誌,那麼你可以使用按位和:

if(flags & MB_ICONWARNING) { ... } 
+1

'只要標誌被定義爲每個都有一位'否,它們不是,它們不需要只包含一個位。 –

+1

實際標誌不一定是2的冪,並且它們可以包含多於1位 – Enigma

+0

@LieRyan正確,改變措辭以反映這一點。 – zennehoy

1

如果你會看here在所有這些錯誤有圖案(我的意思是他們的價值表示),你會發現有很多的按位對它們進行「或」運算。每組標誌保留4位塊,根據該塊的值被修改的特定標誌。

這種組合被選中,所以按位OR可以作爲+運算符。

MB_ICONWARNING ............... 0x00000030L

MB_DEFBUTTON2 ................ 0x00000100L

MB_CANCELTRYCONTINUE。 0x00000006L

位或結果................... 0x00000136L

由於MessageBox看臺爲

第三個參數

對話框的內容和行爲。

編譯器現在可以輕鬆檢查根據按位結果顯示的內容。