Pythonコードを使用して問題を解決しようとしています。このコードでは、「+」または「-」演算子を使用せずに2つの整数を追加する必要があります。私は2つの正の数に対して完全に機能する次のコードを持っています:
def getSum(self, a, b):
while (a & b):
x = a & b
y = a ^ b
a = x << 1
b = y
return a ^ b
このコードは、入力が2つの正の整数または2つの負の整数の場合は完全に機能しますが、一方の数値が正でもう一方の数値が負の場合は失敗します。それは無限ループに入ります。なぜこれが起こっているのかについて何か考えはありますか?
編集:これは、このためのコード修正について説明しているリンクです。
Python 3には、任意精度の整数( "bignums")があります。この手段は、いつのことにx
否定的である、x << 1
ようになりますx
倍の大きさで負の数を。ゼロが右からシフトインすると、数値がどんどん大きくなります。
2の補数では、正の数は0
最上位ビットにあり、負の数は1
最上位ビットにあります。その唯一の場合、手段a
とがb
負である、のトップビットはa
とb
異なります。したがって、x
正(1 & 0 = 0
)にy
なり、負(1 ^ 0 = 1
)になります。したがって、newa
は正(x<<1
)になり、newb
は負(y
)になります。
現在:任意精度の負の整数には、1
少なくとも数学的には、実際には無限の数の先行ビットがあります。だから、a
2各反復で拡大ますます大きな正の数です。b
続けて、より取得し、多くの主要な1
追加のビットは、ビットごとに行うことができるように&
と^
してをa
。したがってa
、オンになっている1
ビットはb
、の追加ビットの1つと一致するa & b
ため、常にtrueであるため、ループは永久に実行されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加