计算机科学的基础之一是知道数字如何以2的补码表示。想象一下,使用32位写下A和B之间的所有数字,包括2的补码表示。你会写下多少1?
输入: 第一行包含测试用例数T(< = 1000)。每个下一个T行包含两个整数A和B.
输出: 输出T行,一行对应每个测试用例。
约束: -2 ^ 31< = A< = B< = 2 ^ 31-1
示例输入:
-2 0
-3 4
-1 4
示例输出:
63
99
37
说明: 对于第一种情况,-2包含31 1后跟0,-1包含32 1和0包含0 1。因此,总数是63。 对于第二种情况,答案是31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99
答案 0 :(得分:1)
for (int i=1; i<line[0]; i++)
{
int numOf1s = 0;
for (int j=line[i].A; j<=line[i].B; j++)
{
for (unsigned int n=j; n>0; n>>=1)
numOf1s += n & 1;
}
printf("%d\n",numOf1s);
}