CPP 如何在无符号整数值中使用布尔值?
CPP how is a boolean used in an unsigned int value?
我正在尝试理解此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
不决心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 代码中显然有一些我不明白的东西,但不知道谷歌它是什么:-)
将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;
(red & mask) == mask
不下决心true
或false
吗?
是的,确实如此!
接下来,在分配给r1
期间,您的true
或false
被强制放入一个unsigned int
,值分别为1
或0
。C++具有实现此目的的隐式转换。
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 是`-1`正确地用作无符号整数的最大值
- 迭代无符号整数的所有值的最漂亮的方法
- 对 int 和无符号整数类型的值应用模运算
- (无符号字符)str 与 str + 0xff 或(无符号整数)值与值 + 0xffff 中的哪一种更快和首选
- 无符号整数的最大值
- 无符号整数的快速无分支最大值
- 从2个无符号整数中获取最小值
- 无符号整数的最大值
- Visual Studio 2013有符号/无符号整数数学行为不同时,求值表达式作为函数参数,编译器切换