1

我有一个很长的号码。现在我想要的是(以伪代码给出),

int cnt1 = 0 
int cnt2 = 0 

for each two bits of that long

       if the two bits == 11
            then cnt1++

       else
            cnt2++

    Print i and i+1 th bits are ... (example 00, 11 etc.) and cnt1 = ... and cnt2 = ...

(for example if number is three (representation "00 00 00 .... 11)" 
  it will give output cnt1 = 1 and cnt2 = 31)

有人可以帮我怎么做吗?

4

3 回答 3

3

您需要做的是在每次迭代时继续向右移动 2 位,并对数字 3(二进制中的 11)进行按位与 (&) 运算:

long number;
int cnt1 = 0;
int cnt2 = 0;
long test = 3;
int counter = 0;    

while(counter < 64) { // we have 64 bits to inspect
    if((number & test) == 3) { // last 2 bits are 11
        cnt1++;
    } else { // last 2 bits are either 10, 01 or 00
        cnt2++;
    }          
    counter += 2;
    number = number >>> 2; // shift by 2 bits to the right
}
于 2012-04-29T14:22:21.967 回答
2

您需要做的是创建一个位掩码并在您的值上运行它,假设这是家庭作业,我只会给出一些指示:

  • 您已经给出的位掩码:long mask = 0x03L;
  • 要检查每隔 2 位,请将您的掩码向左移动 2 个药水
  • 您可以使用 for 循环检查该值,直到您的掩码值为 0
  • 使用按位与运算符&对照掩码检查值

如果您将上述提示放入代码中,您将得到答案:-)

现在编辑结果,我的解决方案是:

long cnt1 = 0;
long cnt2 = 0;

for (long mask = 0x03; mask != 0; mask <<=2) {

    (mask == (value & mask)) ? cnt1++ : cnt2++;
}
于 2012-04-29T14:27:40.513 回答
2

一个简短的回答。

long num = ~0L;
int cnt1 = Long.bitCount(num & (num >>> 1) & 0x5555555555555555L);
System.out.println(cnt1);
int cnt2 = 32 - cnt1;

印刷

32
于 2012-04-29T14:28:28.973 回答