CPP 如何在无符号整数值中使用布尔值?

CPP how is a boolean used in an unsigned int value?

本文关键字:布尔值 无符号整数 CPP      更新时间:2023-10-16

我正在尝试理解此cpp代码,以便将其转换为Java。r1是一个无符号的 int位字段,但看起来这里它被设置为布尔值?

union GpioPins {
struct {
unsigned int ignoredPins1:2;
unsigned int r1:1;
unsigned int g1:1;
unsigned int b1:1;
} bits;
uint32_t raw;
GpioPins() : raw(0) {}
};

然后稍后在包含

GpioPins *bits = ...
uint8_t red   = 141; // any number between 0..255
uint8_t mask = 1 << i; // i is between 0..7 
bits->bits.r1 = (red & mask) == mask;

令人困惑的那条线是最后一条。(red & mask) == mask不决心truefalse吗?

即在Java中,这应该看起来像:

private static class GpioPins {
static class Pins {
int ignoredPins1;
int r1;
int g1;
int b1; 
}
int raw = 0;
Pins bits;
}

然后后来

GpioPins bits = ...
int red   = 141; // any number between 0..255
int mask = 1 << i; // i is between 0..7 
bits.bits.r1 = (red & mask) == mask;  // compile error, incompatible types

cpp 代码中显然有一些我不明白的东西,但不知道谷歌它是什么:-)

bool分配给unsigned int是合法的事情,在C++中是一件合法的事情。true会将其设置为1false会将其设置为0。这是在C++中隐式完成的。

在 Java 中,行:bits.bits.r1 = (red & mask) == mask;不起作用,因为您无法将布尔值隐式分配给 int。

试试这个:bits.bits.r1 = ((red & mask) == mask) ? 1 : 0;

(red & mask) == mask不下决心truefalse吗?

是的,确实如此!

接下来,在分配给r1期间,您的truefalse被强制放入一个unsigned int,值分别为10。C++具有实现此目的的隐式转换