如何将带有布尔值的数组转换为 Arduino/C/C++ 中的字节?
How do i convert an array with booleans to a byte in Arduino/C/C++?
我是 arduino 编程的新手 (c/c+)。并想将带有 bool 的数组转换为类似字节的数组。布尔值在这里代表一个按钮。
bool array[] = {0,1,1,0}; // needs to convert to 0b0110
// bool array[] = {1,0,0,0}; // needs to convert to 0b1000
// bool array[] = {true,true,false,true}; // needs to convert to 0b1101
void setup(){
byte b = convert(array); // 0b0110
}
byte convert(bool array[]){
byte b = 0b + 0 + 1 + 1 + 0; // <- wrong stuff here :(
return b;
}
我现在不能重写你所有的代码,但我可以列出一个基本算法。我想它会对你有所帮助。
你需要一些东西,无论是循环的还是硬编码的(如果你真的只有四位)。为简洁起见,我将调用您的数组 a
并且我将对计算进行硬编码以使其非常清晰。
如果你以位的形式考虑你的数组的条目,它是这样的:
eights fours twos ones
{ 0 , 1 , 1 , 0 }
您可以通过使用左移运算符 <<
获得这些值,该运算符将每个移位的值加倍。
因此,将数组最左边的成员作为最高有效位,您可以这样做:
shift 3 shift 2 shift 1 no shift
uint8_t b = (a[0] << 3) + (a[1] << 2) + (a[2] << 1) + a[3];
so -> no eights one four one two no ones
6 = 0 + 4 + 1 + 0
你看到规律了吗?每个较低有效位向左移动一个 LESS,将其总值减半。这些值的总和就是您的字节值 (uint8_t
).
还有其他符号具有相同的效果,但这个是最容易理解的。
现在是布尔值。您可以使用三元运算符并测试每个元素,如下所示:
uint8_t b = (
(a[0] ? 1 << 3 : 0) +
(a[1] ? 1 << 2 : 0) +
(a[2] ? 1 << 1 : 0) +
(a[3] ? 1 : 0 )
);
一旦你看到这个模式,你就可以用它做各种很酷的按位构造。
我是 arduino 编程的新手 (c/c+)。并想将带有 bool 的数组转换为类似字节的数组。布尔值在这里代表一个按钮。
bool array[] = {0,1,1,0}; // needs to convert to 0b0110
// bool array[] = {1,0,0,0}; // needs to convert to 0b1000
// bool array[] = {true,true,false,true}; // needs to convert to 0b1101
void setup(){
byte b = convert(array); // 0b0110
}
byte convert(bool array[]){
byte b = 0b + 0 + 1 + 1 + 0; // <- wrong stuff here :(
return b;
}
我现在不能重写你所有的代码,但我可以列出一个基本算法。我想它会对你有所帮助。
你需要一些东西,无论是循环的还是硬编码的(如果你真的只有四位)。为简洁起见,我将调用您的数组 a
并且我将对计算进行硬编码以使其非常清晰。
如果你以位的形式考虑你的数组的条目,它是这样的:
eights fours twos ones
{ 0 , 1 , 1 , 0 }
您可以通过使用左移运算符 <<
获得这些值,该运算符将每个移位的值加倍。
因此,将数组最左边的成员作为最高有效位,您可以这样做:
shift 3 shift 2 shift 1 no shift
uint8_t b = (a[0] << 3) + (a[1] << 2) + (a[2] << 1) + a[3];
so -> no eights one four one two no ones
6 = 0 + 4 + 1 + 0
你看到规律了吗?每个较低有效位向左移动一个 LESS,将其总值减半。这些值的总和就是您的字节值 (uint8_t
).
还有其他符号具有相同的效果,但这个是最容易理解的。
现在是布尔值。您可以使用三元运算符并测试每个元素,如下所示:
uint8_t b = (
(a[0] ? 1 << 3 : 0) +
(a[1] ? 1 << 2 : 0) +
(a[2] ? 1 << 1 : 0) +
(a[3] ? 1 : 0 )
);
一旦你看到这个模式,你就可以用它做各种很酷的按位构造。