长位的Java位操作 – 计数设置和未设置位

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

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) 

任何人都可以帮我怎么做?

您需要做的是在每次迭代时向右移动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 } 

简短的回答。

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

版画

 32 

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

  • 你已经给出的位掩码: long mask = 0x03L;
  • 每隔2位检查一次,将你的面具移动2次
  • 你可以使用for循环来检查值,直到你的掩码值为0
  • 使用bitwise-和operator &来检查掩码的值

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

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

 long cnt1 = 0; long cnt2 = 0; for (long mask = 0x03; mask != 0; mask <<=2) { (mask == (value & mask)) ? cnt1++ : cnt2++; }