提取由数字中的特定位组表示的值

Jay*_*Jay 2 c bit-manipulation endianness

如何提取给定数字中特定位组所代表的值,即如果位11,12和13是1,1,0则该值应为6.

做同样事情最有效的方法是什么?此外,它应该是通用的.我应该能够给出开始和结束位位置,并且应该能够提取起始位置和结束位置之间存在的位所代表的值.

例如:00000000 00000000 01100000 00011111

对于上面的数字,考虑到第0位来自右端,如果我给出这个数字,0作为起始位置,2作为结束位置,那么我应该得到值7.

另外,对于上述问题,我们如何处理字节序?

ken*_*ytm 6

six = (value >> 12) & 7;
Run Code Online (Sandbox Code Playgroud)

如果你想成为通用的,

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));
Run Code Online (Sandbox Code Playgroud)

对于字节序,请参阅何时担心字节序?.