0

この機能の目的がわからなかったので、この機能は何をしますか。

int f( int n, int l, int r )  
{  
return (n << l) >> r;  
}  
4

2 に答える 2

4

nl ビットを左にシフトし、次に r ビットを右にシフトします。

実質的に 2^l を掛けてから 2^r で割ります。

別の言い方をすれば、下位 (lr) ビットをゼロにします。

于 2012-06-26T15:29:05.493 に答える
1

私は常に、より小さな数で実験を行い、バイナリで考えることによって、これらにアプローチします。たとえば、最初に符号なし8 ビット値にしましょう。なろうn0xFF (255)なろl3rなりなさい2

というわけで2段(チャチャ)です。l最初のステップでは、左ビットをシフトします。

1111 1111b << 3 == 1111 1000b == 0xF8 == 248

r次に、結果を右ビットにシフトします。

1111 1000b >> 2 == 0011 1110b == 0x3E == 62

@wildplasserが指摘したように、値は署名されているため、0をシフトする代わりに、符号拡張されます。では、8 ビットの符号付きの値を想定してみましょう。もう一度、10 進数にしましょうn0xFF(-1)

左シフトは同じままですが、右シフトすると符号ビットが拡張されます。

1111 1111b << 3 == 1111 1000b == 0xF8 == -8
1111 1000b >> 2 == 1111 1110b == 0xFE == -2

そのため、関数の意図が何であるかはわかりませんが、少なくともそれが何をするかは理解しています。これが何かを行うための標準的な慣用句である場合、それが何であるかはわかりません。

于 2012-06-26T15:46:34.790 に答える