Из массива в число
- Войдите на сайт для отправки комментариев
Чт, 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 использовать и указателями на массивы разных типов поиграться.
Спасибо, но размерность нестандартная.
Массив правильней описать как byte buf[.. Это с т.з. логики более правильно, потому что, например, в строке 11 сдвиг bool типа влево - нелогично. И еще, если пишите резмерность массива (15), то и заполняйте его до конца, либо в описании не указывайте кол-во элементов, если они Вам не нужны. byte buf[] = {...,...,...};
Ваш вариант вполне рабочий, учитывая, что сама задача не обозначена, а без задачи можно философствовать сколько угодно. Разумеется есть и другие варианты, но есть ли смысл усложнять?
Спасибо, всё понял.