4

重複の可能性:
C の最上位ビットを見つける

1の左端を示すマスクを生成する C 関数を作成するにはどうすればよいですかx

例: 0xFF00 -> 0x8000、および0x6600 -> 0x4000. ここのところ:

int left1(unsigned x){}

わかりますが、0xFF00 == 1111 1111 0000 0000.. その後0x6600 == 0110 0110 0000 0000..困惑しています。

4

3 に答える 3

16

これは 2 つの部分で行うことができます。まず、「ビット スミアリング」と呼ばれる手法を使用して、最初の 1 の右側にあるすべてのビットも 1 になるようにします。

x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
x |= x >> 1;

この時点で、 の入力は0xFF00x等しく0xFFFFなり、 の入力は0x6600x等しくなり0x7FFFます。次に、次を使用して最高の1セットだけを残すことができます。

x ^= x >> 1;
于 2012-09-14T00:26:30.270 に答える
3

1に達するまで右にビットシフトするのにかかる回数を数え、次に同じカウントでその1を左にビットシフトします。

int ct=0;
while (x > 1) { ct++; x = x >> 1; }
x = x << ct;
于 2012-09-14T00:13:52.840 に答える
0

1つのアプローチは、ビットマスクを作成してから、値を右シフトすることです。

つまり、整数が「1000....」または「0.....」になるようにビットマスクを作成します。これは、最初のビットが0か1かによって異なります。

次に、その整数を取得し、最上位ビットではなく最下位ビットになるまで右シフトします。例として、0b10000000 >> 8は1です。

したがって、最初に、整数のサイズに応じて、シフトする必要がありますが、多くのビットが関連しています。

次に、ビットマスクを作成する必要があります。1バイトの整数を考えてみましょう。

unsigned int i = 1 << 8最上位ビットが1である整数iを作成します。

または、16進数を使用することもできます。あなたはすでにそれを知っています0xFF== 11111111。あなたは実際にそれをさらに分割することができます:0xF0==11110000

0xF==はバイナリなので1111、逆になります。1000バイナリでは何ですか、16進数では?10002進数では数8であり、これもたまたま等しい0x8

したがって、1バイトの場合、左端のビットのマスクはです0x80

今!これを32ビットに適用してください!

幸運を!

于 2012-09-14T00:18:02.427 に答える