簡體   English   中英

它如何工作“檢查位標志”

[英]How does it work “checking bit flag”

我已經閱讀了有關此問題的其他問題,但他們沒有回答我的問題。

在下面的代碼中我理解它檢查該位是否已設置,但我的問題是為什么?

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

我不明白為什么它返回一個bool並且它有效,flag是uint8_t1 << 4應該是這樣的00010000 (我想)。 為什么該代碼返回所需單個位的值而不是最右邊的那個或類似的東西?

C ++草案標准部分4.12 布爾轉換說( 強調我的 ):

算術,無范圍枚舉,指針或指向成員類型的指針的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。 對於直接初始化(8.5),std :: nullptr_t類型的prvalue可以轉換為bool類型的prvalue; 結果值為false。

因此任何非零值都將轉換為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 ,因為按位與只設置一個位,以1如果在這兩個操作數的位是1則結果flag & (1 << 4)將僅是非零如果位5flag是也1

int可以轉換為bool 如果其值為零,則轉換后的值為false ,否則為true 自己檢查出來:

bool f = 0;
bool t = 5;

可以將積分,浮點,無范圍枚舉,指針和指針到成員類型的Prvalue轉換為bool類型的prvalues。

零值(對於整數,浮點和未整數枚舉)以及空指針和空指針到成員值將變為false。 所有其他值都成為現實。

請參閱: cppreference

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

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

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

因此,如果使用僅設置了一個位的掩碼,如果未設置該位,則返回0,如果設置該位則返回非零,例如

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

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

然后,因為當轉換為bool時,C ++將轉換將任何非零值視為true,並且當函數為false時將零視為false。

由於這也標記為C,C99有這樣的說法:

6.3.1.2布爾類型

1當任何標量值轉換為_Bool時,如果值比較等於0,則結果為0; 否則,結果為1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM