def __or__(self, other: "Integer") -> "Integer": """ Bit OR 연산( | )을 위한 operator overloading :param other: Integer 타입 가정 :return: 새로운 Integer 객체로 return """ return Integer(BitOperation.or_bits(self.bits, other.bits, self.field_len), self.sign | other.sign)
def str_to_minor(real: List[Bit], val: str, digit: int, length: int) -> (List[Bit], int): """ 소수점 아래의 값을 표현하는 문자열을 읽어 Bit List를 생성하는 함수 :param real: 소수점 위의 값의 Bit List :param val: 소수점 아래의 값을 표현하는 문자열 :param digit: 소수점 위의 자리수 :param length: 원하는 Bit List의 길이 :return: 문자열 실수값에 해당하는 Bit List, 자리수 """ real, ten = BitOperation.equalize_bit_length( real, BitOperation.num_map['10'], length) base = BitOperation.fit_bits(BitOperation.num_map['1'], length) twenty = BitOperation.raw_lshift_bits(ten, 1) remain = BitOperation.empty_bits(length) shift = 1 index = 0 while True: if index < len(val) and index < 6: remain = Arithmetic.raw_mul_bits(remain, twenty) next_digit = BitOperation.lshift_bits( BitOperation.num_map[val[index]], shift, length) remain, _ = Arithmetic.raw_add_bits(remain, next_digit) index += 1 shift += 1 base = Arithmetic.raw_mul_bits(base, ten) else: remain = BitOperation.raw_lshift_bits(remain, 1) if BitOperation.is_empty(BitOperation.raw_or_bits( remain, real)): return real, -127 real = BitOperation.raw_lshift_bits(real, 1) if BitOperation.raw_ge_bits(remain, base): real, _ = Arithmetic.add_bits(real, BitOperation.num_map['1'], length) remain, _ = Arithmetic.sub_bits(remain, base, length) if BitOperation.first_bit_index(real) == 0: remain = BitOperation.raw_lshift_bits(remain, 1) if BitOperation.raw_ge_bits(remain, base): real = BitOperation.or_bits(real, BitOperation.num_map['1'], length) break elif BitOperation.is_empty(real): digit -= 1 return real, digit