获取位字段的值

时间:2012-04-30 00:55:54

标签: c bit-fields

unsigned value( unsigned n, unsigned low, unsigned high ){
    if( !(low <= high && high <= 32) )  exit(EXIT_FAILURE);
    if( low == 0 && high == 32 )
        return n;
    else
        return n >> low & (1U << (high-low)) - 1;
}

想象我们有以下因为n = 11100011,低= 2,高= 7。

当我们到达退货声明时,我有这个

00111000&amp; (00100000 - 00000001)

这将是

00111000&amp; 00011111

等于

00011000

但那不对吗?那是24,而我想要00111000,这是56

我在这里做错了什么?我在哪里搞砸了?

2 个答案:

答案 0 :(得分:2)

在减去1之前,你需要向左移一个位置。这会将1位的字符串向左扩展一个位置,这是high位所在的位置。

return (n >> low) & ((1U << (high-low+1)) - 1);

想象一下极端情况,low = 0high = 32。忽略溢出,这是一个大小为long的工件,并进行计算:

(n >> 0) & ((1U << 33) - 1)

左边的术语只是n,右边的术语是32 1位的字符串。

答案 1 :(得分:1)

看起来像一个错误:

n >> low = 11100011 >> 2 = 111000 = 56

然后屏蔽高位,你正在与high-low个进行AND运算:

111000 & (1 << 5)-1

但是(1 << 5)-1 = 11111,但你真的想要111111(否则你要超出前导位,实际上从值中减去32)。因此,请使用:

return n >> low & (1U << (high - low + 1)) - 1;