この問題は、2011 Codesprint ( http://csfall11.interviewstreet.com/ ) からのものです。
コンピュータ サイエンスの基本の 1 つは、数値が 2 の補数でどのように表されるかを知ることです。A から B までのすべての数値を 2 の補数表現で 32 ビットを使用して書き留めるとします。全部で何個の 1 を書き留めますか? 入力: 最初の行には、テスト ケースの数 T (<1000) が含まれます。次の各 T 行には、2 つの整数 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 です。2 番目のケースの場合、答えは 31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99 です。
-X の 1 の数と (-X) = X-1 の補数の 0 の数が等しいという事実を利用して、検索を高速化できることがわかりました。解決策は、答えを生成するための O(log X) 再帰関係があると主張していますが、私はそれを理解していません。ソリューション コードは、 https ://gist.github.com/1285119 で確認できます。
この関係がどのように導き出されるかを誰かが説明できれば幸いです!