あなたが最初最上位ビット(HSB)を計算し、それに応じてシフトすることができます。
int hsb = -4;
for(uint cnum = num; cnum != 0; cnum >>= 1, hsb++);
if(hsb < 0) {
hsb = 0;
}
uint result = num >> hsb;
このように、最初に最高のセットビット(またはそのインデックスからマイナス4)のインデックスを検出することを目指しています。何のセットビットはcnum
にもはや存在しなくなるまで私たちは、hsb
をインクリメントし、右にcnum
(num
のコピー)をシフトすることにより、これを行います。
次は、私たちは、このような一連のビットがあることを確認し、それが少なくとも指数4を持っていること(ない場合は、何も行われません)。その結果、オリジナルのnum
は、hsb
によって右にシフトされます。
私は0x123
でこれを実行すると、私はcsharp
インタラクティブシェルで0x9
を得る:
csharp> uint num = 0x123;
csharp> int hsb = -4;
csharp> for(uint cnum = num; cnum != 0; cnum >>= 1, hsb++);
csharp> if(hsb < 0) {
> hsb = 0;
> }
csharp> uint result = num >> hsb;
csharp> result
9
0x123
はバイナリで0001 0010 0011
です。したがって:
0001 0010 0011
1 001
1001
は9
です。この回答へ
そのようなビットがあることは保証されていますか? '0000'や' 0010'の場合はどうなりますか? –