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 = 1110011、low = 2、high=7として次のようになっていると想像してください。

リターンステートメントに到達するまでに、私はこれを持っているでしょう

00111000&(00100000-00000001)

これは

00111000&00011111

等しいだろう

00011000

しかし、それは正しくありませんか?56である00111000が欲しいのにそれは24です

私はここで何を間違っているのですか?どこで失敗したの?

4

2 に答える 2

2

1を引く前に、もう1つ位置を左にシフトする必要があります。これにより、1ビットの文字列が、highビットが存在する場所である左にもう1つ拡張されます。

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

極端な場合を想像してみてlow = 0くださいhigh = 32。のサイズのアーティファクトであるオーバーフローを無視してlong、次の計算を行います。

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

左側の用語はちょうどn、右側の用語は321ビットの文字列です。

于 2012-04-30T00:59:15.357 に答える
1

1つのエラーでオフのように見えます:

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

次に、上位ビットをマスクするために、次のビットとAND演算を行いhigh-lowます。

111000 & (1 << 5)-1

しかし(1 << 5)-1 = 11111、しかし、あなたは本当に欲しいです111111(そうでなければ、あなたは先頭のビットをANDで計算し、値から32を効果的に減算します)。したがって、代わりに次を使用します。

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