它如何工作“检查位标志”

时间:2014-01-28 20:01:12

标签: c++ bit-manipulation bit-shift

我已经阅读了有关此问题的其他问题,但他们没有回答我的问题。

在下面的代码中,我理解它会检查该位是否已设置,但我的问题是为什么?

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

我不明白为什么它返回bool并且它有效,标志为uint8_t1 << 4应该是这样00010000(我认为)。为什么那段代码会返回所需的单个位的值,而不是最右边的那个或类似的东西?

4 个答案:

答案 0 :(得分:6)

C++ draft standard部分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,那么bitwise and只会将位设置为1。{{}如果flag & (1 << 4)的位5也是flag,则只会非零

答案 1 :(得分:3)

int可以转换为bool。如果其值为零,则转换后的值为false,否则为true。 自己看一下:

bool f = 0;
bool t = 5;
  

整数,浮点,无范围枚举,指针和指向成员类型的Prvalues可以转换为bool类型的prvalues。

     

零值(对于整数,浮点和未整数枚举)以及空指针和空指针到成员值变为false。所有其他值都成为现实。

请参阅:cppreference

答案 2 :(得分:2)

&运算符执行按位布尔AND运算。这意味着,如果且仅当在两个输入中都设置了一个位,则在最终输出中设置一个位,例如

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

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

因此,如果您使用仅设置了一个位的掩码,如果未设置该位,则返回0;如果设置该位,则返回非零,例如

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

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

然后,由于C ++会在转换为bool时将任何非零值转换为true,而将0视为false,则该函数将起作用。

答案 3 :(得分:0)

由于这也标记为C,因此C99可以这样说:

  

6.3.1.2布尔类型

     

1当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果是1。