Из массива в число

_root_
Offline
Зарегистрирован: 18.03.2015

Всем привет!

Прошу подсказать как правильно решить такую задачу: Имеется массив данных типа boolean, например: boolean buf[10] = {1,0,1,1,1,1,1,0,0,1};

требуется разобрать массив на несколько бинарных чисел, например число a = с 0 по 4 элементы массива(получается 0b10111), b = с 5 по  9 (0b11101) и перевернуть число: младший бит слева (в итоге должно получится a = 0b11101; b = 10011).

Сам смог решить задачу вот таким способом:



boolean buf[15] = {1,0,1,1,1,1,1,0,0,1}; 
int a=0;
int b=0;

void setup() { 
  Serial.begin(115200); 
}
void loop() {
  
  for (int i=0; i<5; i++) {
    a |= (buf[i] << i);
  }
  
  for (int i=5; i<10; i++) {
    b |= (buf[i] << (i-5));
  }
  
  Serial.print(a,BIN);
  Serial.print("\t");
  Serial.println(b,BIN);
  
  
  delay(300);  
}

Может есть более простые решения? Может такие задачи решаются иначе?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Обычно заводят одно или двубайтовую переменную и манипулируют ее битами, а у вас получается наоборот.

_root_
Offline
Зарегистрирован: 18.03.2015

Вас не затруднит написать простой примерчик?

X-Dron
Offline
Зарегистрирован: 24.01.2015

А чем вызвана размерность в 5 бит для кодирования числа? Будь она 8, то можно было бы и union использовать и указателями на массивы разных типов поиграться.

union test{
  bool buf_B[16];
  uint8_t buf_i[2];
};

 

_root_
Offline
Зарегистрирован: 18.03.2015

Спасибо, но размерность нестандартная.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Массив правильней описать как byte buf[.. Это с т.з. логики более правильно, потому что, например, в строке 11 сдвиг bool типа влево - нелогично. И еще, если пишите резмерность массива (15), то и заполняйте его до конца, либо в описании не указывайте кол-во элементов, если они Вам не нужны. byte buf[] = {...,...,...};

Ваш вариант вполне рабочий, учитывая, что сама задача не обозначена, а без задачи можно философствовать сколько угодно. Разумеется есть и другие варианты, но есть ли смысл усложнять?

 

_root_
Offline
Зарегистрирован: 18.03.2015

Спасибо, всё понял.