1
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、low=2 和 high=7。

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

00111000 & (00100000 - 00000001)

这将是

00111000 & 00011111

这将等于

00011000

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

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

4

2 回答 2

2

在减去 1 之前,您需要再左移一个位置。这会将1位串再向左扩展一个位置,即该high位所在的位置。

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

想象一下极端情况, wherelow = 0high = 32。忽略溢出,它是 的大小的伪影long,并进行计算:

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

左边的项是n,右边的项是一个 321位的字符串。

于 2012-04-30T00:59:15.357 回答
1

看起来像一个错误:

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

然后为了屏蔽高位,你用一个 ANDing high-low

111000 & (1 << 5)-1

但是(1 << 5)-1 = 11111,但是您确实想要111111(否则您将与前导位相与,有效地从值中减去 32)。因此,请使用:

return n >> low & (1U << (high - low + 1)) - 1;
于 2012-04-30T01:15:14.697 回答