最初の非ゼロを取得することで、動的な 8 ビット ブレークではなく、自然な 8 ビット ブレークを意味byte
すると思います。int
int
自然な 8 ビット ブレーク:
00000000
|
00010110
|
10110010
|
11110001
==>00010110
動的 8 ビット ブレーク:
00000000000
|
10110101
|
1001011110001
==>10110101
これは、ループまたは分岐なしbyte
の自然な 8 ビット ブレークで最初の非ゼロを返します。このコードは、の回答int
よりも効率的である場合とそうでない場合があります。paulsm4
コードのベンチマークやプロファイリングを行って、どちらが最適かを判断してください。
Java コード: ideone link
class Main {
public static void main(String[] args) {
int i,j;
for (i=0,j=1; i<32; ++i,j<<=1) {
System.out.printf("0x%08x : 0x%02x\n",j,getByte(j));
}
}
public static byte getByte(int n) {
int x = n;
x |= (x >>> 1);
x |= (x >>> 2);
x |= (x >>> 4);
x |= (x >>> 8);
x |= (x >>> 16);
x -= ((x >>> 1) & 0x55555555);
x = (((x >>> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >>> 4) + x) & 0x0f0f0f0f);
x += (x >>> 8);
x += (x >>> 16);
x &= 0x0000003f;
x = 32 - x; // x now equals the number of leading zeros
x &= 0x00000038; // mask out last 3 bits (cause natural byte break)
return (byte)((n&(0xFF000000>>>x))>>>(24-x));
}
}