【问题标题】:How do i convert an array with booleans to a byte in Arduino/C/C++?如何在 Arduino/C/C++ 中将带有布尔值的数组转换为字节?
【发布时间】:2020-07-29 15:33:15
【问题描述】:

我是 arduino 编程 (c/c+) 的新手。并且想将带有布尔值的数组转换为类似字节的数组。布尔值在这里表示一个按钮。

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;
}

【问题讨论】:

    标签: c++ arrays arduino


    【解决方案1】:

    我现在不能重写你所有的代码,但我可以列出一个基本的算法。我想它会对你有所帮助。

    你需要一些东西,要么是循环的,要么是硬编码的(如果你真的只有四位的话)。为简洁起见,我将调用您的数组a,我将硬编码计算,使其超级清晰。

    如果您以位为单位考虑数组的条目,则如下所示:

     eights  fours  twos  ones
    {   0   ,  1   , 1   , 0 }
    

    您可以使用左移运算符&lt;&lt; 获得这些值,该运算符将每次移位的值加倍。

    因此,将数组中最左边的成员作为最重要的位,您可以这样做:

                 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 )
        );
    

    一旦你看到这个模式,你就可以用它做各种很酷的按位构造。

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2017-06-08
      • 2018-09-10
      • 2011-03-19
      相关资源
      最近更新 更多