Рассчитать битовую маску по заданному индексу в 16-битной архитектуре - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть функция, которая принимает индексную переменную типа unsigned long (этот тип нельзя изменить).

void func(unsigned long index);

Мне нужно преобразовать его в битовую маску так, чтобы для индекса 0 битовая маска была 1, для битовой маски индекса 1 - 2, для 2 - 4 и т. Д.

Я сделал следующее:

mask = 1 << index;

Проблема в том, что я работаю с 16-битной архитектурой, поэтому длинные переменные без знака отображаются как 32-битные, что портит эту переменную. (младшие 16 бит дают мне правильное значение для маски, но старшие 16 бит добавляют дополнительную информацию, которая запутывает это).

т.е.. Вместо получения: маска = 0000000000000001 (16 бит)

Я получаю: xxxxxxxxxxxxxxxx0000000000000001 (32 бита)

Есть ли другой способ вычислить эту битовую маску?

Буду признателен за помощь.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Ваш основной код правильный, хотя я заметил, что вы не указали тип mask.

Если вызывающий передает значение больше 15 в index, что вы собираетесь делать? Похоже, вы должны максимально использовать плохую ситуацию. В зависимости от контекста, который вы можете просто вернуть из func, вы можете утверждать, или вы можете продолжить с mask, равным нулю.

Это возвращает нас к вопросу о типе mask. Я бы определил его как unsigned short, uint16 или подобное, в зависимости от вашей среды. Но кроме этого, ваша первая попытка была в основном правильной. Это просто вопрос обработки ошибок.

uint16 shift = index & 15;
uint16 mask = 1 << shift;
0 голосов
/ 07 сентября 2018

У вас правильный подход. Однако проблема с вашей реализацией заключается в том, что тип 1 в 1 << index выражении равен int с определенным реализацией представлением. Поскольку вы ищете результат unsigned long, используйте ((unsigned long)1) вместо:

unsigned long mask = ((unsigned long)1) << index;

Если ваша платформа поддерживает stdint.h и вам нужна маска определенной ширины, используйте uint32_t вместо:

uint32_t mask = UINT32_C(1) << index;
...