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
我在这里做错了什么?我在哪里搞砸了?
答案 0 :(得分:2)
在减去1之前,你需要向左移一个位置。这会将1
位的字符串向左扩展一个位置,这是high
位所在的位置。
return (n >> low) & ((1U << (high-low+1)) - 1);
想象一下极端情况,low = 0
和high = 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;