重複の可能性:
C の最上位ビットを見つける
1
の左端を示すマスクを生成する C 関数を作成するにはどうすればよいですかx
。
例: 0xFF00 -> 0x8000
、および0x6600 -> 0x4000
. ここのところ:
int left1(unsigned x){}
わかりますが、0xFF00 == 1111 1111 0000 0000..
その後0x6600 == 0110 0110 0000 0000..
困惑しています。
重複の可能性:
C の最上位ビットを見つける
1
の左端を示すマスクを生成する C 関数を作成するにはどうすればよいですかx
。
例: 0xFF00 -> 0x8000
、および0x6600 -> 0x4000
. ここのところ:
int left1(unsigned x){}
わかりますが、0xFF00 == 1111 1111 0000 0000..
その後0x6600 == 0110 0110 0000 0000..
困惑しています。
これは 2 つの部分で行うことができます。まず、「ビット スミアリング」と呼ばれる手法を使用して、最初の 1 の右側にあるすべてのビットも 1 になるようにします。
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
x |= x >> 1;
この時点で、 の入力は0xFF00
にx
等しく0xFFFF
なり、 の入力は0x6600
にx
等しくなり0x7FFF
ます。次に、次を使用して最高の1
セットだけを残すことができます。
x ^= x >> 1;
1に達するまで右にビットシフトするのにかかる回数を数え、次に同じカウントでその1を左にビットシフトします。
int ct=0;
while (x > 1) { ct++; x = x >> 1; }
x = x << ct;
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進数では?1000
2進数では数8
であり、これもたまたま等しい0x8
したがって、1バイトの場合、左端のビットのマスクはです0x80
。
今!これを32ビットに適用してください!
幸運を!