簡體   English   中英

如何在 Arduino/C/C++ 中將帶有布爾值的數組轉換為字節?

[英]How do i convert an array with booleans to a byte in Arduino/C/C++?

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

我現在不能重寫你所有的代碼,但我可以列出一個基本的算法。 我想它會幫助你。

你需要一些東西,要么是循環的,要么是硬編碼的(如果你真的只有四位的話)。 為簡潔起見,我將調用您的數組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 )
    );

一旦你看到這個模式,你就可以用它做各種很酷的按位構造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM