CPP 如何在 unsigned int 值中使用布尔值?

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

我正在尝试理解此 cpp 代码,以便将其转换为 Java。 r1 是一个 unsigned 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 代码中有一些我不明白的东西,但不知道它是什么 google :-)

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

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

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

Doesn't (red & mask) == mask resolve to true or false?

是的,确实如此!

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