2016-10-07 3 views
0

저는 Codeacademy에서 Python 2.7 과정의 "고급"단계를 시작했으며 수동 bitwise OR (|) 작업을 수행하는 기능을 작성하려고했습니다. 가장 읽을 수있는 솔루션 (그렇게하지 그래서 파이썬)하지 않습니다와 내가 와서 무엇파이썬 비트 OR (|) 연산자의 내부 논리는 무엇입니까?

...

def bitwiseOr(bin1, bin2): 
    """Perform a bitwise OR swap of two string representations of a binary number""" 

    # if the second bit is larger (in length), swap them 
    if len(bin1) < len(bin2): 
     bin1, bin2 = bin2, bin1 

    # cast string into list using list comprehension 
    result = [x for x in bin1] 
    resultString = "" 

    # start at the end of the smallest length bit string, 
    # moving backwards by 1 char, and stop at the 2nd char 
    for i in range(len(bin2), 2, -1):   
     if bin2[i-1] == "1": 
      result[i] = bin2[i-1] 

    # convert the list back into a string 
    for item in result: 
     resultString += item   

    return resultString 


print bin(0b1110 | 0b101) 
print bitwiseOr("0b101", "0b1110") 

위의 두 print 전화에 모두 바이너리를 반환 첫 번째 통화에 불구하고 (같은 결과를 반환 두 번째 숫자는 2 진수의 문자열 표현을 반환합니다).

가독성을 제쳐두고 - 논리적으로 이 어떻게 내부적으로 파이썬에 의해 처리되었는지 보는 것이 흥미 롭습니다. CPython 저장소를 돌아 다니는 것은 올바른 파일을 찾은 것 같지만 (C는 내게 매우 외국 임) 사실에도 불구하고 많은 것을 산출하지 못했습니다.

논리적으로 말하면, 주어진 문제를 해결하는 데는 일반적으로 몇 가지 방법이 있습니다. 각 숫자의 기본 2 표현을 문자열로 전달하고, 더 큰 길이의 이진을 기반으로 목록을 만들고, 각 문자를 비교하여 1을 우선적으로 비교합니다.

어떻게 내부적으로 파이썬을합니까?

+0

"파이썬이 어떤 로직을 사용하여 각 비트를 교체하거나 바꿀 까?"라는 질문을 받고 있습니다. 나는 그것이 ** 무슨 일을하는지 이해하고, 이제는 ** 어떻게 ** 알고 싶다. – GrayedFox

+0

필자는 결국이 명령을 저레벨의 CPU 명령으로 변환한다는 것을 확신합니다. –

+0

그래서 비트가 대체되는 방법을 묻고 있습니까? '100101'을 예로 들어 보겠습니다. '100101 | 011101 '은'111101'이다. 어느 비트가 1이면 결과 비트는 1입니다. – Li357

답변

0

교육받지 않은 사람 (컴퓨터 과학 배경 지식이없는 사람)에게이 질문은 Python의 비트 OR 연산의 C 구현을 이해하려고 시도하는 것입니다.

그러나 더 많은 연구를 한 후에 훈련 된 눈에 대한 질문은 사실상이 유형의 작업을 이해하는 the processor itself이기 때문에 어리석은 것으로 보일 수 있습니다.

이 의미는 파이썬 bitwise OR 연산의 내부 논리가 실제로는 완전히 dependent on the instructions available to the CPU인데, 즉 더 높은 수준의 언어에 종속되지 않는다는 것을 의미합니다.

요약하면, 파이썬 비트 OR 연산자의 내부 논리는 해당 기계의 비트 (1과 0)에 대한 비교를 수행하며,이 연산을 수행하는 방법은 상기 비트의 직접 비교입니다. 마음을 불어 넣는 것은 not dissimilar to how Ancient Egyptians performed multiplication입니다. 와우.

1

OR 연산자는 두 개의 경로가있는 병렬 전기 회로와 유사합니다. 단 하나의 경로가 끊어져도 전류는 계속 흐릅니다. 두 경로가 모두 끊어진 경우에만 중지됩니다. 하지만 논리가 신중히 결정 되어야만하는 것처럼 보일지라도 파이썬에서 OR 연산자를주의해야합니다. 그렇지 않으면 코드를 디버깅하는 데 어려움을 겪을 수 있습니다.

+0

이것은 좋은 비유이지만 질문에 답을하지는 못하지만, 이제는 명확하게 업데이트되었습니다. 하지만 upvoted, 고마워. – GrayedFox