- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
任务是仅使用按位运算符实现位计数逻辑。我让它工作得很好,但我想知道是否有人可以建议一种更优雅的方法。
只允许按位操作。没有“如果”、“为了”等
int x = 4;
printf("%d\n", x & 0x1);
printf("%d\n", (x >> 1) & 0x1);
printf("%d\n", (x >> 2) & 0x1);
printf("%d\n", (x >> 3) & 0x1);
谢谢。
最佳答案
来自 http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
unsigned int v; // count bits set in this (32-bit value)
unsigned int c; // store the total here
c = v - ((v >> 1) & 0x55555555);
c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
c = ((c >> 4) + c) & 0x0F0F0F0F;
c = ((c >> 8) + c) & 0x00FF00FF;
c = ((c >> 16) + c) & 0x0000FFFF;
编辑:不可否认,它有点优化,这使得它更难阅读。阅读起来更容易:
c = (v & 0x55555555) + ((v >> 1) & 0x55555555);
c = (c & 0x33333333) + ((c >> 2) & 0x33333333);
c = (c & 0x0F0F0F0F) + ((c >> 4) & 0x0F0F0F0F);
c = (c & 0x00FF00FF) + ((c >> 8) & 0x00FF00FF);
c = (c & 0x0000FFFF) + ((c >> 16)& 0x0000FFFF);
这五个步骤中的每一步,将相邻的位以 1、2、4 等为一组相加。该方法基于分而治之。
在第一步中,我们将位 0 和 1 相加并将结果放入两位段 0-1,将位 2 和 3 相加并将结果放入两位段 2-3 等...
第二步我们将0-1和2-3两位相加,结果放入4位0-3,将4-5和6-7两位相加,结果放入四位 4-7 等...
例子:
So if I have number 395 in binary 0000000110001011 (0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 1)
After the first step I have: 0000000101000110 (0+0 0+0 0+0 0+1 1+0 0+0 1+0 1+1) = 00 00 00 01 01 00 01 10
In the second step I have: 0000000100010011 ( 00+00 00+01 01+00 01+10 ) = 0000 0001 0001 0011
In the fourth step I have: 0000000100000100 ( 0000+0001 0001+0011 ) = 00000001 00000100
In the last step I have: 0000000000000101 ( 00000001+00000100 )
等于5,这是正确的结果
关于c - 如何仅使用位运算符实现 Bitcount?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815165/
我正在尝试使用redis位图保存在线用户,使用命令“bitcount onlineUser”来计算在线用户的数量。我使用RedisTemplate处理redis。但是我在RedisTemplate中找
这是我的助教帮我搞定的代码,但后来我完全忘记了它到底是如何工作的,因为我似乎无法得到正确的答案,面试评分是明天。如果有人可以帮忙,请帮忙。谢谢 * bitCount - returns count o
任务是仅使用按位运算符实现位计数逻辑。我让它工作得很好,但我想知道是否有人可以建议一种更优雅的方法。 只允许按位操作。没有“如果”、“为了”等 int x = 4; printf("%d\n", x
谁能解释一下这是如何工作的? #define BX_(x) ((x) - (((x)>>1)&0x77777777) \
任务是仅使用按位运算符实现位计数逻辑。我让它工作得很好,但我想知道是否有人可以建议一种更优雅的方法。 只允许按位操作。没有“如果”、“为了”等 int x = 4; printf("%d\n", x
尝试在二进制数中查找 1(设置位)的编号。我能够得到较小数字的结果,但是当数字变大时,它会崩溃,代码如下: public class time { public static void
位计数的 Big O 是多少?我不确定该方法是如何工作的,但我假设它是在 O(logn) 中完成的。 具体来说,使用此代码(其中 x = 4,y = 1): return Integer.bitCou
我现在在 bit.c 实验室工作。我制作了函数 bitCount。我认为它很完美,但它无法通过测试。我不知道为什么。 int bitCount(int x) { unsigned int a
我知道这是代码。但我无法理解它的作用 `public static int bitCount(long i){ i = i - ((i > > > 1) & 0x55555555
我们有一个图像数据库,我在其中使用 Dr. Neal Krawetz's method 计算了 PHASH由 David Oftedal 实现. 部分示例代码计算这些 long 之间的差异在这里: u
假设我需要为 0...255 个值创建一个包含预先计算的位计数值(数字中 1 位的计数)的 LUT: int CB_LUT[256] = {0, 1, 1, 2, ... 7, 8}; 如果我不想使用
我有一个程序正在对 Long.bitCount() 进行大量调用,如此之多以至于它在一个 CPU 内核上占用了 33% 的周期。有没有比 Sun JDK 版本更快的实现方式? 我试过了: This a
如何计算变量中有多少个零位?我必须使用像 thist BITCOUNT(x,c) 这样的宏,其中 x 是我的变量,c 是 x 中零位的计数 示例:X = 00101001 和 C = 5 最佳答案 一
是否已经为 big.Int 编写了 BitCount 方法? math/big好像没有。 显然,如果没有,我会自己写一个 - 有人已经写过吗? 我想要数字中设置的位数。喜欢Java BigIntege
我想使用著名的麻省理工学院比特计数算法的一个版本,使用 SSE2 指令计算康威生命游戏中的邻居数。 这是 C 语言中的 MIT 位计数,扩展为计算位计数 > 63 位。 int bitCount(un
此方法 BigInteger.bitCount() “返回此 BigInteger 的二进制补码表示中与其符号位不同的位数。” 如果数字是正数,就是数字中1位的个数。 我很难得到正确的负数。 例如,数
看完Can someone explain redis setbit command? 和http://blog.getspool.com/2011/11/29/fast-easy-realtime-
我在中看到了已弃用成员的使用 java.math.BigInteger.bitCount() 是否有相同的替代方案或者我们不需要它?因为如果未初始化,则正在计算值。 只是想证实我的说法? 最佳答案 不
bitCount()的描述和 bitLength()相当神秘: public int bitCount() Returns the number of bits in the two's comple
有没有类似Java的Integer.bitCount(int)的方法或 Long.bitCount(long) .NET Framework 中的任何位置? (对于那些不熟悉这些 Java 方法的人)
我是一名优秀的程序员,十分优秀!