次のビットシフトを逆にして、6972307 / 1/2/3の値を抽出できるようにする方法はありますか?そうでない場合は、(1 << 17)の値のみが実際に「必要」です。
long shifted = (6972307 << 22) | (1 << 17) | (2 << 12) | 3;
追加の背景。
17だけシフトした値の最大値は6で、12シフトした値の最大値は31です。
ANDs
シフトと:の組み合わせを使用できます。
var v1 = shifted & 0xfff; //3
var v2 = (shifted >> 12) & 0x1f; //2
var v3 = (shifted >> 17) & 0x1f; //1
var v4 = (shifted >> 22);
はい、結果を右シフトして不要なビットをマスクすることで、これを実現できます。
long top = shifted >> 22;
long part1 = (shifted >> 17) & 7;
long part2 = (shifted >> 12) & 31;
long part3 = shifted & 3;
で使用されるビット数によっては、上部の正しい結果が得られない場合があることに注意してくださいlong
。
式が次のようになるように、6972307を長い前のシフトに変換してみてください。
long shifted = ((long)6972307 << 22) | (1 << 17) | (2 << 12) | 3;
したがって、すべてのビットをint変数ではなく、long変数に正しく格納します。その後、右シフトで6972307の値を取り戻すことができます
long shiftedBack = shifted >> 22;
ただし、左にシフトしている値(この例では6972307)には、まだ最大値が必要であることに注意してください。その最大22ビットシフトを超えると、一部のビットがカットオフされ、正しくシフトバックできなくなります。