以位序列计数1和0

时间:2014-08-29 09:29:13

标签: bit

这两种方法来自Hacker's Delight。我希望按位序列计算0和1的数量。

例如,对于以下序列00000000000000000011011100111101, 我想在删除前导零后我会得到:

  • 2 Ones
  • 1 Zero
  • 3 Ones
  • 2 Zero
  • 4 Ones
  • 1 Zero
  • 1个

我虽然这个结果是通过减去存储计数零和一的 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;
}

0 个答案:

没有答案