这个问题来自 2011 Codesprint ( http://csfall11.interviewstreet.com/ ):
计算机科学的基础之一是了解数字如何在 2 的补码中表示。想象一下,您使用 32 位以 2 的补码表示形式写下 A 和 B 之间的所有数字。你一共要写多少个1?输入:第一行包含测试用例的数量 T (<1000)。接下来的 T 行中的每一行都包含两个整数 A 和 B。 输出:输出 T 行,一个对应于每个测试用例。约束:-2^31 <= A <= B <= 2^31 - 1
样本输入:3 -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
我意识到您可以使用 -X 中 1 的数量等于 (-X) = X-1 的补码中 0 的数量这一事实来加快搜索速度。该解决方案声称存在用于生成答案的 O(log X) 递归关系,但我不明白。解决方案代码可以看这里:https ://gist.github.com/1285119
如果有人能解释这种关系是如何得出的,我将不胜感激!