2015-03-09 4 views
0

Добрым вечер,битой математики и маска корреляция с номерами

Я пытаюсь соотнести необходимые значения для значений, которые необходимо отправить на устройства I2C, и у меня возникли проблемы с битовой математикой и маскировкой.

Мой диапазон от -15 до 15, так же как и диапазон устройства. Example of required values

Вот что я использую, чтобы добраться до нужных значений, кажется, работает, насколько я могу судить. «number1» - это значение Power On для этого регистра.

int number1 = 254; 
    int number2 = 14; 
    int number3; 
    int number4; 

    if (number2 <= 0) { 
    number3 = number2 + 15; 
    } 
    else { 
    number3 = (number2^15) | 16; // XOR 0b00001111 then Set bit 4 
} 

    number4 = (number1 & 0b11100000) + number3; 

У меня возникли проблемы, пытаясь выяснить, как установить/убрать 5 необходимые биты в регистре, который 8 бит, не затрагивая 3 наивысших бита.

Я думаю, что у меня это есть, но это похоже на такой неэффективный способ сделать это, есть ли лучший способ сделать это?

Благодаря,

DW

+0

Нет ничего плохого в том, как вы очищаете биты. Я обычно вижу HEX-литералы в побитовых операциях (будет 'number4 = (number1 & 0xE0) + number3;' в вашем примере), но это не имеет большого значения. – Eran

+0

Спасибо за ваш комментарий, я буду помнить об этом. – Deskwizard

ответ

0

, чтобы очистить 5 LSB биты со значением 8 бит, не затрагивая 3 MSB бит,

number &= 0xE0; 

установить 5 LSB биты,

number |= 0x1F; 
+0

Спасибо, я уверен, что это будет полезно – Deskwizard

Смежные вопросы