binary.py
에서 v
는 현재 테스트하는 추의 무게, n
은 물체의 초과 무게(저울에 추를 올려놓는 것을 시뮬레이션하기 위해 그저 n
에서 추의 무게를 뺄 뿐이다. 저울에서는 물체가 추보다 무겁거나 가볍다는 사실만 알 뿐, 얼마나 무거운지는 알 수 없다)이다. v
의 값은 매번 2배씩 감소한다. v
가 n
보다 크면 0
을 출력하고, 그렇지 않으면 1
을 출력하고 n
에서 v
를 뺀다. 이 코드도 마찬가지로 트레이스(루프를 반복할 때마다의 n
, v
, n < v
의 값과 출력 비트)를 살펴보면 프로그램을 이해하는 데 도움이 된다. [표 1.3.5]의 가장 오른쪽 열을 위에서부터 읽으면 10011로서 19를 이진수로 표현한 것이다.
프로그램 1.3.7 이진수로 변환 (binary.py)
import sys import stdio n = int(sys.argv[1]) # n보다 작거나 같은 수중 가장 큰 2의 거듭제곱수 v 계산 v = 1 while v <= n // 2: v *= 2 # v를 반으로 줄이면서 루프를 반복한다. while v > 0: if n < v: stdio.write(0) else: stdio.write(1) n -= v v //= 2 stdio.writeln()
v n |
현재 2의 거듭제곱수 현재 초과수 |
이 프로그램은 명령 줄 인수로 받은 양의 정수를 높은 자리부터 한 자리씩 내려가면서 이진수로 출력한다.
% python3 binary.py 19 10011 % python3 binary.py 255 11111111 % python3 binary.py 512 1000000000 % python3 binary.py 100000000 101111101011110000100000000