이진법(binary): 두 개의 숫자(1과 0)만을 이용하는 수 체계.
-Reference.Binary number
따라서, 자연수 의 이진수는 자연수 n을 2로 나눈 몫이 0이 될 때까지 2로 나누고 그 나머지를 거꾸로 변환한 수
이다.
따라서 이진수를 구하는 알고리즘을 파이썬으로 구현하면 다음과 같다.
def decimal_to_binary(decimal: int) -> str:
binary = []
while (decimal > 0):
binary.append(str(decimal % 2))
decimal //= 2
return "".join(reversed(binary))
decimal_to_binary(11)
>>> 1011
위의 1.1. 이진법 알고리즘을 활용하여 다음과 같이 파이썬으로 문제를 풀이할 수 있다.
import sys
def print_binary(decimal: int) -> None:
digits: int = 0
while (decimal > 0):
if decimal % 2:
print(digits, end=" ")
digits += 1
decimal //= 2
print(digits)
T = int(sys.stdin.readline())
for i in range(T):
print_binary(int(sys.stdin.readline()))
사실 Python 내장함수에 진법 변환 함수가 있다.
bin(int)
: 10진수 → 2진수
oct(int)
: 10진수 → 8진수
hex(int)
: 10진수 → 16진수
int(str, n: int)
: n진수 → 10진수
bin(11)
>>> "0b1011"
oct(11)
>>> "0o13"
hex(11)
>>> "0xb"
int("b", 16)
>>> 11
비트 연산(bitwise operation): 한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산.
-Reference.Bitwise operation
Python의 비트 논리 연산자는 다음과 같다.
&
: AND
|
: OR
^
: XOR
~
: NOT
위의 2.1. Python 비트 연산자를 활용하여 다음과 같이 파이썬으로 문제를 풀이할 수 있다.
import sys
from collections import Counter
T = int(sys.stdin.readline())
num = 0
for i in range(T):
n, x = list(map(int, sys.stdin.readline().split()))
v = Counter(list(map(int, sys.stdin.readline().split())))
if x == 0:
for c in v.keys():
num += (v[c] * (v[c] - 1))
else:
for c in v.keys():
num += (v[c] * v[x^c])
print(num // 2)
num = 0