我正在尝试理解这个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
解析不到true
或false
?
即。在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它是什么: - )
答案 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
解析为true
或false
?
是的,确实如此!
接下来,在分配到r1
期间,您的true
或false
被强制转换为unsigned int
,其值为1
或0
分别。 C ++具有隐式转换,可以实现这一目标。