2014-01-28 28 views
3

我已閱讀關於此問題的其他問題,但他們不回答我的問題。它是如何工作的「檢查位標誌」

在下面的代碼中我明白它檢查是否設置了該位,但我的問題是爲什麼?

bool test(uint8_t& flag) 
{ 
    return flag & (1 << 4); 
} 

我不知道爲什麼它返回一個bool和它的作品,標誌爲uint8_t1 << 4應該是這樣的00010000(我認爲)。爲什麼該代碼返回所需的單個位的值,而不是最右邊的或類似的東西?

+0

你能挑,你用C或C++語言?看起來像C++,但我想確保。 –

+1

@ KarolyHorvath:看到使用bool關鍵字,我會假設C在這裏是無關的。 – PlasmaHH

+1

@PlasmaHH:'#包括'。 C++提示是通過引用(這裏,順便說一下,這裏沒有意義),但除此之外,兩種語言的答案都是相同的。 –

回答

6

C++ draft standard4.12布爾轉換說(重點礦山):

算術的prvalue,無作用域枚舉,指針,或指向部件類型可以轉換爲布爾類型的prvalue。 將零值,空指針值或空成員指針值轉換爲false;任何其他值都將轉換爲true。對於直接初始化(8.5),類型std :: nullptr_t的prvalue可以轉換爲類型爲bool的prvalue;結果值是錯誤的。

因此,任何非零值將被轉換爲true

您表示了一定的懷疑,我們有一個快速的方法來檢查的1 << 4結果此使用std::bitset

#include <bitset> 
#include <iostream> 

int main() 
{ 
    std::bitset<8> b1(1<<4); 

    std::cout << b1 << std::endl ; 

    return 0; 
} 

,我們可以看到的結果確實00010000因爲bitwise and只有一點點設置爲1如果兩個操作數中的位都是1,那麼flag & (1 << 4)的結果將只會是非零如果位5flag也是1

+0

我以前upvoted,但提'的std :: bitset'就應該至少多一個;)... –

+2

謝謝你,我現在明白了。該功能確實有用。 – LuissRicardo

3

可以將int轉換爲bool。如果其值爲零,則轉換後的值爲false,否則爲true。 檢查出來yorself:

積分,浮點,無作用域枚舉,指針,指針到成員類型的
bool f = 0; 
bool t = 5; 

Prvalues可以轉換爲bool類型的prvalues。

零值(用於整型,浮點型和非範型枚舉)以及空指針和空指針至成員值變爲false。所有其他值成爲真實。

參見:cppreference

+1

記:你會看到這個曾經相當嚴重,尤其是在形式'如果(整數)' –

+0

謝謝你,連我都用它,但只'1'(TRUE;)或'0'('假'),我不知道'0'是'假',其他都是'真'。 – LuissRicardo

0

因爲這也標記C,C99有這樣一段話:

6.3.1。2布爾類型

1當任何標量值轉換爲_Bool,結果是0,如果值進行比較等於0;否則,結果爲1.

2

&運算符執行按位布爾AND運算。這意味着,一個位在最終輸出如果設置,且僅當它例如設置在兩個輸入端,所以

00011100 
& 01010101 
    -------- 
= 00010100 

    11010101 
& 01010101 
    -------- 
= 01010101 

所以,如果你使用口罩已經只有一個位設置它會如果該位未設置則返回0,如果設置則返回非零值,例如

11110111 
& 00001000 
    -------- 
= 00000000 

    00001111 
& 00001000 
    -------- 
= 00001000 

而且,由於C++將轉換轉換爲bool和零爲假的功能工作時,把任何非零值作爲真。