重複の可能性:
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進数では?10002進数では数8であり、これもたまたま等しい0x8
したがって、1バイトの場合、左端のビットのマスクはです0x80。
今!これを32ビットに適用してください!
幸運を!