파이썬의 이진수


81

십진수로 변환하지 않고 파이썬에서 이진수를 어떻게 더하고 빼고 비교할 수 있습니까?


1
이것은 숙제 질문입니까, 즉 낮은 수준에서 수학을하는 방법을 묻는 것입니까? 참조 ( stackoverflow.com/questions/1149929/... )
톰 Leys

1
당신이 성취하고자하는 것에 대한 몇 가지 예를들 수 있습니까?
John La Rooy

8
숫자는 이미 파이썬에서 이진입니다. 프로그램이 시작될 때 바이너리로 변환되고 str () 또는 print와 같은 것을 사용할 때만 10 진수로 다시 변환됩니다.
John La Rooy

답변:


142

bin () 및 int ()를 사용하여 바이너리의 문자열 표현간에 변환 할 수 있습니다.

>>> bin(88)
'0b1011000'
>>> int('0b1011000', 2)
88
>>> 

>>> a=int('01100000', 2)
>>> b=int('00100110', 2)
>>> bin(a & b)
'0b100000'
>>> bin(a | b)
'0b1100110'
>>> bin(a ^ b)
'0b1000110'

감사합니다. 네, 이것은 숙제입니다. 할당은 ._add, ._sub, ._gt, ._lt 및 ._eq를 수행 할 때 숫자를 '이진 형식'으로 남겨 두도록되어 있습니다. 위의 예는 bin에서 int로 변환하는 것 같습니다. 이것이 받아 들일지 확실하지 않지만 귀하의 예를 제외하고는 다른 방법은 없습니다.

7
Python 2.6 이상을 사용할 때 바이너리 리터럴을 사용할 수도 있습니다. 예를 들어 int('01100111',2)작성 하는 대신 . 0b01100111103
Joschua

9

바이너리가 무엇인지 혼란스러워하는 것 같습니다. 2 진법과 10 진법은 숫자의 다른 표현 일뿐입니다. 예를 들어 101 진법 2와 5 진법 10은 같은 숫자입니다. 더하기, 빼기 및 비교 연산은 숫자에 대해 작동합니다.-101 base 2 == 5 base 10 및 더하기는 작업중인 기본에 관계없이 동일한 논리 연산입니다. 파이썬 인터프리터가 내부적으로 항목을 바이너리로 저장할 수 있다는 사실은 작업 방식에 영향을주지 않습니다. 정수 유형이있는 경우 +,-등을 사용하십시오.

이진수 문자열이있는 경우 자체 구현을 작성하거나 int (binaryString, 2) 함수를 사용하여 변환해야합니다.


7

비트 연산자에 대해 이야기하고 있다면 다음과 같습니다.

~ Not
^ XOR
| Or
& And

그렇지 않으면 숫자는 어떻게 보든 숫자이기 때문에 이진수는 십진수와 정확히 동일하게 작동합니다. 십진법과 이진법의 유일한 차이점은 데이터를 볼 때 데이터를 표현하는 방법입니다.


비트 연산자로 add, sub 등을 작성하는 것이 항상 재미 있습니다. 이것에 관심이있는 사람은 회로, 더 구체적으로 절반 가산기, 전체 가산기, 마지막으로 감산기, 아마도 가산기-감산기에 대한 가이드를 찾으십시오. 여기에서 비트 연산자로 변환 할 수 있습니다.
Horse SMith 2015

3

이진수, 십진수, 16 진수 ... 밑수는 숫자를 읽거나 출력 할 때만 중요합니다. 이진수를 추가하는 것은 십진수를 추가하는 것과 같습니다. 단지 표현의 문제입니다.


0

다음은 이전에 게시 된 함수를 다시 작성한 것입니다.

def addBinary(a, b): # Example: a = '11' + b =' 100' returns as '111'.    
    for ch in a: assert ch in {'0','1'}, 'bad digit: ' + ch    
    for ch in b: assert ch in {'0','1'}, 'bad digit: ' + ch    
    sumx = int(a, 2) + int(b, 2)    
    return bin(sumx)[2:]

0
'''
I expect the intent behind this assignment was to work in binary string format.
This is absolutely doable.
'''

def compare(bin1, bin2):
    return bin1.lstrip('0') == bin2.lstrip('0')

def add(bin1, bin2):
    result = ''
    blen = max((len(bin1), len(bin2))) + 1
    bin1, bin2 = bin1.zfill(blen), bin2.zfill(blen)
    carry_s = '0'
    for b1, b2 in list(zip(bin1, bin2))[::-1]:
        count = (carry_s, b1, b2).count('1')
        carry_s = '1' if count >= 2 else '0'
        result += '1' if count % 2 else '0'
    return result[::-1]

if __name__ == '__main__':
    print(add('101', '100'))

저는 빼기 기능을 독자를위한 연습으로 남겨 둡니다.


-1

도움이되는지 확실하지 않지만 여기에 솔루션을 남겨 둡니다.

class Solution:
    # @param A : string
    # @param B : string
    # @return a strings
    def addBinary(self, A, B):
        num1 = bin(int(A, 2))
        num2 = bin(int(B, 2))
        bin_str = bin(int(num1, 2)+int(num2, 2))
        b_index = bin_str.index('b')
        return bin_str[b_index+1:]

s = Solution()
print(s.addBinary("11", "100"))


-6

바이너리가 무엇인지 혼란스러워하는 것 같습니다. 2 진법과 10 진법은 숫자의 다른 표현 일뿐입니다. 예를 들어 101 진법 2와 5 진법 10은 같은 숫자입니다. 더하기, 빼기 및 비교 연산은 숫자에 대해 작동합니다-101 base 2 == 5 base 10 및 더하기는 작업중인 기본에 관계없이 동일한 논리 연산입니다.


질문이 무엇을 요구했는지 잘못 해석하고있는 것 같습니다. OP는 이진 표현의 숫자를 읽고 / 조작하고 정수 표현의 숫자와 상호 작용하도록하는 방법을 찾고있었습니다.
Josh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.