- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是否已经为 big.Int 编写了 BitCount
方法? math/big好像没有。
显然,如果没有,我会自己写一个 - 有人已经写过吗?
我想要数字中设置的位数。喜欢Java BigInteger.bitCount() .
最佳答案
如前所述,为了快速有效地原始访问 big.Int
的底层位你想用 big.Bits
.此外,比 8 位查找表或简单循环更快的是使用众所周知的 64 位计数方法之一(又名 Hamming weight )。更快,您可以使用 popcount
的汇编实现使用 native CPU instruction ¹.
不使用汇编,或迎合已知设置的位很少的特殊情况,这可能是更快/最快的 Go 实现之一(通过使用 uint32
并调整popcount
相应的功能):
func BitCount(n *big.Int) int {
count := 0
for _, v := range n.Bits() {
count += popcount(uint64(v))
}
return count
}
// Straight and simple C to Go translation from https://en.wikipedia.org/wiki/Hamming_weight
func popcount(x uint64) int {
const (
m1 = 0x5555555555555555 //binary: 0101...
m2 = 0x3333333333333333 //binary: 00110011..
m4 = 0x0f0f0f0f0f0f0f0f //binary: 4 zeros, 4 ones ...
h01 = 0x0101010101010101 //the sum of 256 to the power of 0,1,2,3...
)
x -= (x >> 1) & m1 //put count of each 2 bits into those 2 bits
x = (x & m2) + ((x >> 2) & m2) //put count of each 4 bits into those 4 bits
x = (x + (x >> 4)) & m4 //put count of each 8 bits into those 8 bits
return int((x * h01) >> 56) //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ...
}
这里介绍的这个和其他实现的基准和比较可以在 GitHub gist 上完整获得。 .
¹ 例如 one added in Go1.9 ;更新后的要点显示它比我之前最好的快了约 3 倍。
关于go - 有 big.BitCount 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105791/
我正在尝试使用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 方法的人)
我是一名优秀的程序员,十分优秀!