Переключение битов в Hex - PullRequest
1 голос
/ 31 мая 2010

У меня 8-значное шестнадцатеричное число, для которого мне нужны определенные цифры, равные 0 или f. Учитывая конкретное место цифр, есть быстрый способ сгенерировать шестнадцатеричное число с теми местами, "перевернутыми" в f. Например:

flip_digits(1) = 0x000000f
flip_digits(1,2,4) = 0x0000f0ff 
flip_digits(1,7,8) = 0xff00000f 

Я делаю это на встроенном устройстве, поэтому я не могу вызывать какие-либо математические библиотеки, я подозреваю, что это можно сделать всего лишь с помощью сдвигов, но я не совсем понимаю метод Подойдет любое решение (Python, C, Pseudocode). Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 31 мая 2010
result = 0
for i in inputs:
  result |= 0xf << ((i - 1) << 2)
4 голосов
/ 31 мая 2010

Вы можете определить восемь именованных переменных, каждая с заданным полубайтом, установить все биты на:

unsigned n0 = 0x0000000f;
unsigned n1 = 0x000000f0;
unsigned n2 = 0x00000f00;
unsigned n3 = 0x0000f000;
unsigned n4 = 0x000f0000;
unsigned n5 = 0x00f00000;
unsigned n6 = 0x0f000000;
unsigned n7 = 0xf0000000;

Затем вы можете использовать побитовый или объединить их:

unsigned nibble_0 = n0;
unsigned nibbles_013 = n0 | n1 | n3;
unsigned nibbles_067 = n0 | n6 | n7;

Если вы хотите объединить их во время выполнения, вероятно, было бы проще всего сохранить константы в массиве, чтобы к ним было проще обращаться (например, n[0] | n[6] | n[7]).

...