【发布时间】:2012-04-17 15:27:19
【问题描述】:
我的问题与论坛上的一个问题有关 - Number of 1s in the two's complement binary representations of integers in a range 我没有“添加评论”。所以我在这里问 问题是在以 2 的补码形式写下所有数字时计算 1 的数量,这些数字在两个输入数字指定的范围内 解决方案发布在https://gist.github.com/1285119 如下
long long solve(int a)
{
if(a == 0) return 0 ;
if(a % 2 == 0) return solve(a - 1) + __builtin_popcount(a) ;
return ((long long)a + 1) / 2 + 2 * solve(a / 2) ;
}
long long solve(int a,int b)
{
if(a >= 0)
{
long long ret = solve(b) ;
if(a > 0) ret -= solve(a - 1) ;
return ret ;
}
long long ret = (32LL * -(long long)a) - solve(~a) ;
if(b > 0) ret += solve(b) ;
else if(b < -1)
{
b++ ;
ret -= (32LL * -(long long)b) - solve(~b) ;
}
return ret ;
}
当输入为 4 //测试用例数
-1 //第一个数字 -2 //第二个数字 输出 0
-1 -3 输出 -31
-3 -5 输出 -30 //1 的个数怎么可能是 -30
1 2 输出 2
由于代码作为 Codesprint 解决方案发布在 InterviewStreet 上,并且在这个论坛上获得了高度投票的答案。它应该是正确的。 谁能解释一下这条线背后的逻辑 long long ret = (32LL * -(long long)a) -solve(~a) in solve(int a,int b) 而#define INF (int)1e9 //不使用时设置无穷大的目的是什么?
【问题讨论】:
-
例如检查my answer here。
-
你看过
std::bitset吗?