我已经阅读了有关此问题的其他问题,但他们没有回答我的问题。
在下面的代码中,我理解它会检查该位是否已设置,但我的问题是为什么?
bool test(uint8_t& flag)
{
return flag & (1 << 4);
}
我不明白为什么它返回bool
并且它有效,标志为uint8_t
而1 << 4
应该是这样00010000
(我认为)。为什么那段代码会返回所需的单个位的值,而不是最右边的那个或类似的东西?
答案 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。