Я большой поклонник метода «двухсменной» добычи. Работает как подписанный, так и неподписанный. Чтобы извлечь поле ширины w
с младшим битом lsb
из word
:
#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
В этом случае BITSIN(word) == 32
и lsb+width == 32
, поэтому, если рассматриваемое слово не подписано, вы можете просто сдвинуть вправо на 10 без маскировки.
Одно предупреждение: Остерегайтесь 32-битных сдвигов на 32-битных типах ! Стандарт C позволяет компилятору делать что угодно, а то, что делают обычные чипы Intel, бесполезно: x << y
сдвиги x
влево на y % 32
бит (при условии, что x
имеет 32-битный целочисленный тип). Это означает, что если вы попытаетесь сдвинуть 32-битное целое число влево или вправо на 32 бита, результат будет таким же, как в случае отсутствия операции. Существует аналогичная проблема с 64-битными сдвигами 64-битных типов.