2013-10-31 3 views
0

나는 여기에 질문/답변의 몇 가지를 통해 읽어 봤는데 :Two 's Complement의 정의?

def twos_comp(val, bits): 
    """compute the 2's compliment of int value val""" 
    if((val&(1<<(bits-1))) != 0): 
     val = val - (1<<bits) 
    return val 
:

twos-complement-in-python

is-twos-complement-notation-of-a-positive-number-the-same-number

사람은 숫자의 2의 보수를 만들 수있는 몇 가지 예제 코드를했다

또한 누군가가 2의 보수를 다음과 같이 정의했습니다.

2의 보수 표기법은 n 비트 2의 보수를 사용하여 부호를 뒤집습니다. 8 비트 숫자의 경우 2^8에서 숫자를 뺀 값이 음수 인 입니다.

이러한 선언은 변경되지 않았습니다. 그러나, 2의 보완의 나의 이해와 함께 그 chides가있다. 이진수를 반전하고 1을 더함으로써 계산 된 것으로 생각했습니다. (숫자 표현에 제한된 수의 비트가 있다는 이해와 함께)

또한 2의 보수에는 additive inverse이라는 특성이 있어야합니다. 원래 번호. 하지만, twos_comp의 출력에는 그 것으로 나타나지 않습니다. 내 정의에서 내 손 계산 (그리고 내가 쓴 몇 가지 테스트 코드)에서 숫자와 그 두 개의 보수가 함께 더 해지면 1이 오버플로되고 나머지 비트는 0이므로 이것이 첨가물을 갖는다는 것을 알 수있다. inverse 속성.

2가 보완에 대한 정의가 여러 개인가요? 혼란 스럽습니까? 아니면 다른 게시물의 정의와 기능이 잘못 되었습니까?

+0

는 [유튜브]에 몇 가지 괜찮은 물건이있다 (http://www.youtube.com/watch?v=9W67I2zzAfo)는 – JMK

답변

1

실제로 2 진수를 반전하고 음수에 1을 더하면 두 자리 보수가 계산됩니다. abs (-1) = 1 = 01 -> bitwise_inv (abs (-1)) + abs (-1) = FE + 1 = FF. 이것은 2^8에서 숫자를 뺀 것으로 제공된 정의와 같습니다 (이는보기가 어렵지 않습니다).

제공 한 샘플 코드는 유용한 방법으로 2의 보수를 계산하지 않습니다. 나는 그게 무엇을 하려는지 이해하지 못한다. 숫자에서 2 * 8을 뺀 것과 같이 "2^8에서 숫자를 빼는 것"과 상당히 다른 것처럼 보이며, 또한 값을 참조 할 때 기억하지 못한다. 우리가 의미하는 것은 부호없는 값입니다.

동일한 템플릿을 사용하면보다 정확한 구현이 가능합니다. 정확하게 2^8에서 숫자를 뺍니다.

def twos_c(val,bits): 
    if ((val&(1<<(bits-1)))!=0): 
    val=(1<<bits)-abs(val) 
    return val 
+0

아, 내가보고, 다른 기능은 실제 정수 2의 보수에서 역 전환한다 . 이런. – aestrivex

+0

그래서 혼란 스러웠습니다. 이 두 절차가 동일한 목표를 달성하고 주어진 샘플 코드를 이해하지 못했음을 알았습니다. 하드웨어 디자인의 맥락에서 반전 추가 방식에 대해 배웠습니다. 따라서 힘을 가할 수있는 능력은 우리를 훨씬 넘어 섰습니다. 2의 보수와 더하기 회로로 숫자를 간신히 감할 수 있기 때문입니다. 그러나 코드 관점에서 볼 때 2^비트에서 숫자를 빼는 것이 매우 편리하다는 것을 알 수 있습니다. – beeflobill