본문 바로가기

Python3

[python3] Two's compliment(2의 보수)

코드

def bindigits(n, bits):
    s = bin(n & int("1"*bits, 2))[2:]    # int("1111111111111111", 2)""안의 숫자를 int단위로 2진수 표시, [2:]는 앞의 0b제거
                                         # int("111",2) 결과 값은 7, bin(int"111",2) 결과 값은 0b111.
                                         # n에다가 2진수 16bit의 최대값을 연산곱하라(Two's complement니까)

    print("s : ", s)					# 0을 채우지 않은 변환 값
    return ("{0:0>%s}" % (bits)).format(s)   #s의 결과 값의 앞에 bit 수만큼 0을 채워라.

bindigits(-12288,16)

 

설명 

16대의 설비나 장비의 on/off (1 또는 0) 정보들을 처리하기 위해서

 

장비 정보들의 작동여부만 따서 16자리의 binary로 저장하기도한다. 

 

보통 그 이유는 HW의 저장 용량을 아낄 수 있고 빠르게 불러올 수 있기 때문이다.

 

단점이라면 변환이 헷갈리고 의미를 모르면 활용을 못한다는 것이다.

 

저장의 예를 들자면 1111111011000011 이런 식인데 이게 컴퓨터에서 다시 읽으면 Decimal형태로 바뀌어져 들어온다.

 

거기에 -값을 사용하는 Two's compliment(2의 보수)로 읽어들여지는데

 

이것을 변환하는 방법이 Python에서는 위와 같다. 자세한 설명은 아래의 출처에 상세하게 나왔다.

 

출처

https://stackoverflow.com/questions/12946116/twos-complement-binary-in-python

 

Two's Complement Binary in Python?

Integers in Python are stored in two's complement, correct? Although: >>> x = 5 >>> bin(x) 0b101 And: >>> x = -5 >>> bin(x) -0b101 That's pretty lame. How d...

stackoverflow.com

 

https://ko.wikipedia.org/wiki/2%EC%9D%98_%EB%B3%B4%EC%88%98

 

2의 보수 - 위키백과, 우리 모두의 백과사전

2의 보수(--補數, 영어: two's complement)란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수보다 한 자리

ko.wikipedia.org

굳이 프로그램까지 만들 필요가 없거나 간단하게 확인하고 싶다면

https://www.rapidtables.com/convert/number/decimal-to-binary.html?x=-7

 

Decimal to Binary Converter

Divide by the base 2 to get the digits from the remainders: Divisionby 2 Quotient Remainder(Digit) Bit #

www.rapidtables.com