C++ 在[x,y]范围内整数的两个补码表示中计算1
我的问题与论坛上的一个问题有关- 我没有“添加评论”,所以我在这里问 问题是在写下2的补码形式的所有数字时,计算1的数量,这些数字在两个输入数字指定的范围内 解决方案发布在 详情如下:C++ 在[x,y]范围内整数的两个补码表示中计算1,c++,algorithm,binary,C++,Algorithm,Binary,我的问题与论坛上的一个问题有关- 我没有“添加评论”,所以我在这里问 问题是在写下2的补码形式的所有数字时,计算1的数量,这些数字在两个输入数字指定的范围内 解决方案发布在 详情如下: 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
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
-一,
-3
产出-31
-三,
-5
输出-30//1的数量怎么可能是-30
一,
2.
产出2
因为代码在InterviewStreet上以Codesprint solutions的形式发布,并且在这个论坛上得到了高度投票的回答。它应该是正确的。
有人能解释一下背后的逻辑吗
long long ret=32LL*-long longa-solve~a在解算int a,int b中
不使用INF int1e9//设置无穷大值的目的是什么?输入的结果错误
-1 -2
-1 -3
-3 -5
这是因为程序假定两个限值是按升序输入的,并且不进行检查,因此输入不符合该期望会产生错误的结果。简单的
if (b < a) {
int temp = a;
a = b;
b = temp;
}
在int solveint a的开头,int b将使其以任意顺序返回输入的正确结果
long-long-ret=32LL*-long-longa-solve~a背后的逻辑是,在两个补码中,n的位补码是~n=-n-1。如果a<0,则从a到-1(包括两者)的数字中的0或1位总数为32*| a |。从该计数中,我们减去这些数字中0位的总数,即按位补码中1位的总数。这些按位补码是从0到| a |-1=~a的数字,两者都包含在内,其中1位的计数由solve | a |-1=solve~a给出。例如,检查。您看过吗?