Из массива в число
- Войдите на сайт для отправки комментариев
Чт, 19/03/2015 - 08:23
Всем привет!
Прошу подсказать как правильно решить такую задачу: Имеется массив данных типа 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);
}
Может есть более простые решения? Может такие задачи решаются иначе?
Обычно заводят одно или двубайтовую переменную и манипулируют ее битами, а у вас получается наоборот.
Вас не затруднит написать простой примерчик?
А чем вызвана размерность в 5 бит для кодирования числа? Будь она 8, то можно было бы и union использовать и указателями на массивы разных типов поиграться.
union test{ bool buf_B[16]; uint8_t buf_i[2]; };Спасибо, но размерность нестандартная.
Массив правильней описать как byte buf[.. Это с т.з. логики более правильно, потому что, например, в строке 11 сдвиг bool типа влево - нелогично. И еще, если пишите резмерность массива (15), то и заполняйте его до конца, либо в описании не указывайте кол-во элементов, если они Вам не нужны. byte buf[] = {...,...,...};
Ваш вариант вполне рабочий, учитывая, что сама задача не обозначена, а без задачи можно философствовать сколько угодно. Разумеется есть и другие варианты, но есть ли смысл усложнять?
Спасибо, всё понял.