最初の非ゼロを取得することで、動的な 8 ビット ブレークではなく、自然な 8 ビット ブレークを意味byteすると思います。intint
自然な 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));
}
}