计算机科学的基础之一是了解数字在二进制补码中的表示方法。假设你使用32位的二进制补码,写下A和B之间(包括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个1。 对于第二个测试用例,答案是31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99。
我意识到可以利用“-X的1的数量等于(-X)的补码的0的数量=X-1”的事实来加速搜索。解决方案声称存在一个O(log X)的递归关系来生成答案,但我不理解它。可以在这里查看解决方案代码: https://gist.github.com/1285119 如果有人能解释一下这个关系是如何推导出来的,我将不胜感激!
F(B) - F(A)
。 - BlueRaja - Danny Pflughoeft