Не могу справиться с задачей собрать число типа unsigned long из отдельных битов с помощью операции ИЛИ
Для младшеих двух байтов все работает, а старшие два байта принимают ошибочные с моей точки зрения значения.
Я понимаю, что можно заменить 32-битное число отдельными байтами, но у меня биты передаются в функцию, их число может быть различно - от 1 до 20 и для удобства вызова этой функции я решил использовать длинное число без знака.
Мои биты:
Код: Выделить всё
#define bit0 1
#define bit1 3
//...здесь определены все биты
#define bit19 0x800000
Объявление функции:
Код: Выделить всё
void myFunc(unsigned long mask){
//здесь разбиваю на байты и получаю бред в третьем байте( и в четвертом, если его использовать)
unsigned char mask0 = mask & 0xFF;
unsigned char mask1 = (mask >>8) & 0xFF;
unsigned char mask3 = (mask >>16) & 0xFF;
};
Вызываю ее:
Код: Выделить всё
myFinc(bit6|bit0|...|bit19|bit3);
в третьем байте - проблема
Для проверки написал вот это, все наглядно:
Код: Выделить всё
unsigned long ul = 0;
void setup() {
Serial.begin(9600);
for (byte j = 0; j < 32; j++){
ul |= (1 << j);
Serial.print(j);
Serial.print(" : ");
Serial.println(ul,BIN);
delay(100);
}
}
void loop() {
}
В чем моя ошибка?