Как задать значения для диапазона битов в переменной?
Здравствуйте!
Требуется сделать значения битов равными 1 в определенном диапазоне в 64-битном unsigned long, оставив остальные биты без изменения. Например, 0x000100100fe80010 должно превратиться в 0xffffffffffefffff, т.е. диапазон fe в числе остается без изменения. Подскажите, как это сделать?
uint64_t var= 0x000100100fe80010u;
uint64_t mask = 0;
for(int i = n; i < m; ++i)
{
mask |= (1 << i);
{
// На выходе в mask биты от n до m выставлены в 1, остальные - 0
var |= ~mask;
jcmvbkbc, писал с телефона без возможности проверить. Добавление единицы было лишним, и для 64 бит требовался unsigned long long.
#define BITMASK(x) ((1ull << x) - 1)
15432, добавление единицы не было лишним если биты считаются с 0. В любом случае такая запись не позволяет установить самый старший бит unsigned long long.
jcmvbkbc, как раз добавление единицы оказалось лишним для отсчета с нуля. старший бит выставляется корректно так как после сдвига будет 0, а вычитание единицы даст все установленные биты
15432, после сдвига 0 не будет, такой сдвиг в С -- это неопределённое поведение. В частности, на x86 сдвиг 32-битного 1u влево на 32 даёт 1, так же, как и сдвиг 64-битного 1ull влево на 64.