-1

一番左のビットを削除するには?

私は16進数値を持っていますBF

そのバイナリ表現は1011 1111

である最初のビットを削除するにはどうすればよい1です0111 1110か?

最後の部分にも「0」を追加するにはどうすればよいですか?

4

3 に答える 3

7

変数のビット Nx0

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 から始まるゼロベースのカウント) がオフになり、他のすべては以前の値を保持します。

変数のビット Nx1

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 になります。

実際に見てください

于 2012-05-13T13:00:51.933 に答える
6
int i=0xbf;
int j=(i<<1) & 0xff;
于 2012-05-13T12:51:03.373 に答える
1

または、次のようにすることもできます:(i * 2)&& 0xff少しいじりたくない場合は、>>1は/2に相当し、<<1は*2に相当します。

于 2012-05-13T13:01:55.673 に答える