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

时间:2017-05-03 18:26:08

标签: java c++ variable-assignment

我正在尝试理解这个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它是什么: - )

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

  

没有(red & mask) == mask解析为truefalse

是的,确实如此!

接下来,在分配到r1期间,您的truefalse被强制转换为unsigned int,其值为10分别。 C ++具有隐式转换,可以实现这一目标。