32位数的1

Abh*_*bhi 15 java algorithm bit-manipulation

我正在寻找一种方法,在32位数字中使用1的数字而不使用其间的循环.任何人都可以帮助我,并为我提供代码或算法.提前致谢.

eri*_*son 44

Integer.bitCount(int).如果你想看看它是如何工作的,你可以参考源代码; 许多Integer课程中有点笨拙的例程都来自Hacker's Delight.

  • 是! 当有一种方法可用时,为什么要使用异国情调的黑客攻击. (4认同)
  • 使用内置函数还可以使未来版本的JVM更容易确定SSE4.2 POPCNT指令可用于此目的. (4认同)

Mit*_*eat 8

请参阅规范参考:Bit Twiddling Hacks

  • 请记住,Java总是*始终*签名,并相应地进行修改. (2认同)

lin*_*lof 5

简短的、经过优化的答案(C 语言):

int pop(unsigned x) {
   x = x - ((x >> 1) & 0x55555555);
   x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
   x = (x + (x >> 4)) & 0x0F0F0F0F;
   x = x + (x >> 8);
   x = x + (x >> 16);
   return x & 0x0000003F;
}
Run Code Online (Sandbox Code Playgroud)

要了解这种魔法为何有效,请参阅小亨利·S·沃伦 (Henry S. Warren, Jr.)撰写的《寻求加速人口计数》第 10 章《美丽的代码》

  • 海事组织你错了。如果一个问题被标记为 Java,那么除了问题是关于 Java 之外,还有什么意思?也许提问者还应该在文本中提到他们在谈论 Java,但如果他们不这样做,我认为我们不应该假装它没有被标记为 Java。如果您可以假设 C 答案是可以接受的,那么我可以假设仅 GCC 的 C 答案是可以接受的,并说使用 __builtin_popcount。但这对提问者没有多大帮助;-) (7认同)
  • 用无符号移位 (`">>>"`) 替换有符号移位 (`">>"`),这段代码正是 Java 的 `Integer.bitCount(int)` 方法中使用的代码。 (2认同)