我已閱讀關於此問題的其他問題,但他們不回答我的問題。它是如何工作的「檢查位標誌」
在下面的代碼中我明白它檢查是否設置了該位,但我的問題是爲什麼?
bool test(uint8_t& flag)
{
return flag & (1 << 4);
}
我不知道爲什麼它返回一個bool
和它的作品,標誌爲uint8_t
和1 << 4
應該是這樣的00010000
(我認爲)。爲什麼該代碼返回所需的單個位的值,而不是最右邊的或類似的東西?
我已閱讀關於此問題的其他問題,但他們不回答我的問題。它是如何工作的「檢查位標誌」
在下面的代碼中我明白它檢查是否設置了該位,但我的問題是爲什麼?
bool test(uint8_t& flag)
{
return flag & (1 << 4);
}
我不知道爲什麼它返回一個bool
和它的作品,標誌爲uint8_t
和1 << 4
應該是這樣的00010000
(我認爲)。爲什麼該代碼返回所需的單個位的值,而不是最右邊的或類似的東西?
的C++ draft standard部4.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)
的結果將只會是非零如果位5
的flag
也是1
。
我以前upvoted,但提'的std :: bitset'就應該至少多一個;)... –
謝謝你,我現在明白了。該功能確實有用。 – LuissRicardo
可以將int
轉換爲bool
。如果其值爲零,則轉換後的值爲false
,否則爲true
。 檢查出來yorself:
bool f = 0;
bool t = 5;
Prvalues可以轉換爲bool類型的prvalues。
零值(用於整型,浮點型和非範型枚舉)以及空指針和空指針至成員值變爲false。所有其他值成爲真實。
參見:cppreference
記:你會看到這個曾經相當嚴重,尤其是在形式'如果(整數)' –
謝謝你,連我都用它,但只'1'(TRUE;)或'0'('假'),我不知道'0'是'假',其他都是'真'。 – LuissRicardo
因爲這也標記C,C99有這樣一段話:
6.3.1。2布爾類型
1當任何標量值轉換爲_Bool,結果是0,如果值進行比較等於0;否則,結果爲1.
&
運算符執行按位布爾AND運算。這意味着,一個位在最終輸出如果設置,且僅當它例如設置在兩個輸入端,所以
00011100
& 01010101
--------
= 00010100
11010101
& 01010101
--------
= 01010101
所以,如果你使用口罩已經只有一個位設置它會如果該位未設置則返回0,如果設置則返回非零值,例如
11110111
& 00001000
--------
= 00000000
00001111
& 00001000
--------
= 00001000
而且,由於C++將轉換轉換爲bool
和零爲假的功能工作時,把任何非零值作爲真。
你能挑,你用C或C++語言?看起來像C++,但我想確保。 –
@ KarolyHorvath:看到使用bool關鍵字,我會假設C在這裏是無關的。 – PlasmaHH
@PlasmaHH:'#包括'。 C++提示是通過引用(這裏,順便說一下,這裏沒有意義),但除此之外,兩種語言的答案都是相同的。 –