Python整数は自動的に大数のピットに変換されます

1440 ワード

昨日LeetCodeは適当に1題を探して日常のブラシを準備して、テーマは371です.2つの整数の和.問題は,+と−を用いない場合に,2つの整数の加算演算を実現することが要求される.興味があれば、自分でLeetCodeを移動してこの問題を見てください.
コンピュータの底辺の原理を知ったことがあるべきで、現在多くのコンピュータはバイナリに基づいて、10進数に対して直接利用することができません.全体的にバイナリを用いたとしても,計算機はそのビット操作を用いて確かに10進数の計算を実現したので,アルゴリズム上では同様の原理でこの問題をシミュレーションして実現する必要がある.原理の核心は主に:異あるいはこのビットの演算結果を表す責任を負い、2つの数が後に左に1つ移動して進位を表す責任を負う.進位が0になったら演算を停止し、このときの異或の値を出力します.最初はあまり考えていませんでしたが、pythonが書けば4行ほどで、スクリプトが実行された後、演算をする2つの数が同記号の場合は問題なく、2つの数字が異号の場合、プログラムは無限ループに陥ります.
while b:
    a, b = a ^ b, (a & b) << 1
    return a

その後、印刷出力で見ると、数字は膨大だが、2倍に変化し、止まらなかった.その後、python数字の特徴を考えてみると、宣言するときにタイプの定義がなく、小数と整数の演算があいまいになることがあります.重要なのは、整数が表示範囲を超えた後に長くなり、大数演算になり、整数オーバーフローが発生しないことです.この特性のため、デジタルビット数が増え続け、アルゴリズムに従って最後に0を出すか出すかを設計するのは難しい.自動変換という現象はよく検証され,intは範囲内の高次方あるいは広範囲の階乗という大数演算を表し,この特性を見ることができる.
数字がすべて符号化されている以上、演算と人為的にオーバーフローを作り、大きすぎる部分を捨てることができます.64ビットのpythonでは、異或演算のたびに0 xFFFFFFと演算を行い、データの長さを保証します.最後に数の大きさに注意して、結果が0 x 7 FFFFFより大きいと、オーバーフローして、0 xFFFFFFFFFFと異ならなければなりません.
最後に通過したコード:
class Solution:
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        while b:
            a, b = (a ^ b) & 0xFFFFFFFF, ((a & b) << 1) & 0xFFFFFFFF
        if a> 0x7FFFFFFF:
            a = ~(a ^ 0xFFFFFFFF)
        return a

ビット演算は慎重に、ビット演算は慎重に、ビット演算は慎重に!