Извлечение значения, представленного определенным набором битов в числе - PullRequest
2 голосов
/ 07 февраля 2010

Как извлечь значение, представленное определенным набором битов в данном числе, то есть, если биты 11,12 и 13 равны 1,1,0, тогда значение должно быть 6.

Какой самый эффективный способ сделать то же самое? Кроме того, оно должно быть общим. Я должен быть в состоянии дать начальную и конечную позиции битов и должен быть в состоянии извлечь значение, представленное битами, присутствующими между начальной и конечной позициями.

Ex: 00000000 00000000 01100000 00011111

Для приведенного выше числа, учитывая, что 0-й бит от правого конца, если я задаю это число, 0 в качестве начальной позиции и 2 в качестве конечной позиции, то я должен получить значение 7.

Кроме того, как мы можем позаботиться о порядке байтов также для вышеуказанной проблемы?

1 Ответ

6 голосов
/ 07 февраля 2010
six = (value >> 12) & 7;

Если вы хотите быть универсальным,

inline unsigned extract_continuous_bits(unsigned value, int start, int end) {
    unsigned mask = (~0u) >> (CHAR_BIT*sizeof(value) - end - 1);
    return (value & mask) >> start;
}

assert(extract_continuous_bits(0x601f, 12, 14) == 6));
assert(extract_continuous_bits(0x601f, 0, 2) == 7));
assert(extract_continuous_bits(0xf0f0f0f0, 0, 31) == 0xf0f0f0f0));
assert(extract_continuous_bits(0x12345678, 16, 31) == 0x1234));
assert(extract_continuous_bits(0x12345678, 0, 15) == 0x5678));

А для порядка байтов см. Когда беспокоиться о порядке байтов? .

...