mpfr
次の関数は、2つのオブジェクトの一致するビット数を返します。
import gmpy2
def matching_bits(x, y):
'''Returns the number of bits that match between x and y. The
sign of x and y are ignored. x and y must be of type mpfr.'''
# Force both values to be positive, and x >= y.
x = abs(x)
y = abs(y)
if x < y:
x, y = y, x
if not isinstance(x, type(gmpy2.mpfr(0))) or not isinstance(y, type(gmpy2.mpfr(0))):
raise TypeError("Arguments must be of type 'mpfr'.")
x_bits, x_exp, x_prec = x.digits(2)
y_bits, y_exp, y_prec = y.digits(2)
# (x_exp - y_exp) is the number of zeros that must be prepended
# to x to align the mantissas. If that is greater than the precision
# y, then no bits in common.
if (x_exp - y_exp) > x_prec:
return 0
x_bits = "0" * (x_exp - y_exp) + x_bits
count = 0
while count < min(x_prec, y_prec) and x_bits[count] == y_bits[count]:
count += 1
return count
私はこの機能を広範囲にテストしていませんが、それはあなたにスタートを与えるはずです。実数成分と虚数成分を別々にチェックする必要があります。符号をチェックし、加算と減算を実行しているかどうかを確認するために、おそらくそれを変更することをお勧めします。