この機能の目的がわからなかったので、この機能は何をしますか。
int f( int n, int l, int r )
{
return (n << l) >> r;
}
この機能の目的がわからなかったので、この機能は何をしますか。
int f( int n, int l, int r )
{
return (n << l) >> r;
}
nl ビットを左にシフトし、次に r ビットを右にシフトします。
実質的に 2^l を掛けてから 2^r で割ります。
別の言い方をすれば、下位 (lr) ビットをゼロにします。
私は常に、より小さな数で実験を行い、バイナリで考えることによって、これらにアプローチします。たとえば、最初に符号なし8 ビット値にしましょう。なろうn
、0xFF (255)
なろl
う3
、r
なりなさい2
。
というわけで2段(チャチャ)です。l
最初のステップでは、左ビットをシフトします。
1111 1111b << 3 == 1111 1000b == 0xF8 == 248
r
次に、結果を右ビットにシフトします。
1111 1000b >> 2 == 0011 1110b == 0x3E == 62
@wildplasserが指摘したように、値は署名されているため、0をシフトする代わりに、符号拡張されます。では、8 ビットの符号付きの値を想定してみましょう。もう一度、10 進数にしましょうn
。0xFF
(-1)
左シフトは同じままですが、右シフトすると符号ビットが拡張されます。
1111 1111b << 3 == 1111 1000b == 0xF8 == -8
1111 1000b >> 2 == 1111 1110b == 0xFE == -2
そのため、関数の意図が何であるかはわかりませんが、少なくともそれが何をするかは理解しています。これが何かを行うための標準的な慣用句である場合、それが何であるかはわかりません。