C++ 在[x,y]范围内整数的两个补码表示中计算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

我的问题与论坛上的一个问题有关- 我没有“添加评论”,所以我在这里问 问题是在写下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(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给出。

例如,检查。您看过吗?