私の質問は、フォーラムの前の質問に関連してい ます-2の補数の範囲内の整数の2の補数表現の1の数 「コメントを追加」はありませんでした。 2の補数形式ですべての数値を書き留める1。2つの入力数値で指定された範囲内。解決策は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//2番目の数値出力0
-1-3出力-31
-3-5出力-30//1の数を-30にするにはどうすればよいですか
12出力2
コードはInterviewStreetにCodesprintソリューションとして投稿されており、このフォーラムで非常に投票された回答であるため、正しいはずです。誰かが行の背後にあるロジックを説明できますかlonglongret =(32LL *-(long long)a)-solve(int a、int b)のsolve(〜a)そして#define INF(int)1e9の目的は何ですか//使用しないときに無限大の値を設定しますか?