这两种方法来自Hacker's Delight。我希望按位序列计算0和1的数量。
例如,对于以下序列00000000000000000011011100111101
,
我想在删除前导零后我会得到:
我虽然这个结果是通过减去存储计数零和一的 p 值得到的。
但我不能从 ffstrl 方法中获得这些值。我错过了什么?
private void ffstrl(int x){
int k,p;
p = 0;
while(x != 0){
k = nlz(x); //Count zeros
x = x << k ;
p = p + k;
k = nlz(~x); //Count Ones
x = x << k;
p = p + k;
}
}
int nlz(int x){
if( x == 0){
return 32;
}
int n = 0;
if( x <= 0x0000FFFF) { n = n + 16; x = x << 16;}
if( x <= 0x00FFFFFF) { n = n + 8; x = x << 8;}
if( x <= 0x0FFFFFFF) { n = n + 4; x = x << 4;}
if( x <= 0x3FFFFFFF) { n = n + 2; x = x << 2;}
if( x <= 0x7FFFFFFF) { n = n + 1;}
return n;
}