一番左のビットを削除するには?
私は16進数値を持っていますBF
そのバイナリ表現は1011 1111
である最初のビットを削除するにはどうすればよい1
です0111 1110
か?
最後の部分にも「0」を追加するにはどうすればよいですか?
x
を0
x &= ~(1 << N);
仕組み:式 1 << N は、左に N 回シフトされた1 ビットです。N = 7 の場合、これは次のようになります。
1000 0000
ビットごとの NOT 演算子~
は、これを次のように反転します。
0111 1111
次に、結果は とビットごとに AND 演算されx
、次のようになります。
xxxx xxxx
0111 1111
--------- [AND]
0xxx xxxx
結果: ビット 7 (LSB から始まるゼロベースのカウント) がオフになり、他のすべては以前の値を保持します。
x
を1
x |= 1 << N;
仕組み: 今回は、シフトされたビットを取得し、 とビットごとに ORしてx
、次のようにします。
xxxx xxxx
1000 0000
--------- [OR]
1xxx xxxx
結果: ビット 7 がオンになり、他のすべては以前の値を保持します。
1
:1 に設定された最上位ビットがわからない場合は、その場で見つけることができます。これを行うには多くの方法があります。合理的なアプローチは
int x = 0xbf;
int highestSetBit = -1; // assume that to begin with, x is all zeroes
while (x != 0) {
++highestSetBit;
x >>= 1;
}
ループの最後では、highestSetBit
予想どおり 7 になります。
int i=0xbf;
int j=(i<<1) & 0xff;
または、次のようにすることもできます:(i * 2)&& 0xff少しいじりたくない場合は、>>1は/2に相当し、<<1は*2に相当します。