*2 를 계산한 값을 출력해도 되지만,
정수를 2배로 곱하거나 나누어 계산해 주는 비트단위시프트연산자 <<, >>를 이용할 수 있다.
컴퓨터 내부에는 2진수 형태로 값들이 저장되기 때문에,
2진수 형태로 저장되어 있는 값들을 왼쪽(<<)이나 오른쪽(>>)으로
지정한 비트 수만큼 밀어주면 2배씩 늘어나거나 1/2로 줄어드는데,
왼쪽 비트시프트(<<)가 될 때에는 오른쪽에 0이 주어진 개수만큼 추가되고,
오른쪽 비트시프트(>>)가 될 때에는 왼쪽에 0(0 또는 양의 정수인 경우)이나 1(음의 정수인 경우)이 개수만큼 추가되고,
가장 오른쪽에 있는 1비트는 사라진다.
예시
n = 10
print(n<<1) #10을 2배 한 값인 20 이 출력된다.
print(n>>1) #10을 반으로 나눈 값인 5 가 출력된다.
print(n<<2) #10을 4배 한 값인 40 이 출력된다.
print(n>>2) #10을 반으로 나눈 후 다시 반으로 나눈 값인 2 가 출력된다.
무슨말을 하는지 모르겠다
chatgpt한테 물어봤다
몫이 0이 될 때까지 2로 계속 나누면서 나머지를 기록하는 게 10진수를 2진수로 변환하는 기본적인 방법입니다.
과정
현재 숫자를 2로 나눕니다.
몫과 나머지를 기록합니다.
몫이 0이 될 때까지 반복합니다.
나머지를 아래에서 위로(뒤집어서) 읽으면 2진수가 됩니다.
백엔드 개발은 대부분 고수준 언어(Django, Flask, Node.js 등)와 프레임워크를 사용해 업무 로직과 데이터 처리를 구현하는 일이 많습니다.
이런 환경에서는 비트 연산이나 진법을 직접 사용할 일이 많지 않습니다.
예를 들어:
데이터베이스 설계와 쿼리 작성
API 개발 및 인증 구현
서버 관리와 배포 작업
이런 작업에서는 비트 연산을 신경 쓰지 않아도 됩니다.
(1) 최적화된 연산
백엔드에서 대규모 데이터 처리가 필요한 경우, 비트 연산을 활용하면 계산 속도를 높일 수 있습니다.
(드랍더비트)
💡숫자는 어떻게 저장되나요?
숫자는 본래 수학적 개념이라 컴퓨터에서 그대로 2진수로 변환됩니다.
예: 10 → 2진수로 변환 → 1010
음수는 특별히 부호를 붙여 표현합니다(예: 2의 보수 방식).
💡텍스트는 어떻게 저장되나요?
컴퓨터는 텍스트를 0과 1로 변환하기 위해 문자 인코딩을 사용합니다.
아스키 코드(ASCII):
알파벳, 숫자, 기호를 숫자로 매핑하여 저장합니다.
예: 'A' → 65 → 2진수로 1000001
아스키코드(ASCII)
범위: 0~127 (7비트, 총 128개 문자)
포함 문자:
영어 알파벳(AZ, az)
숫자(0~9)
몇 가지 기호(!, @, # 등)
제어 문자(줄 바꿈, 탭 등)
장점: 단순하고 저장 크기가 작음(1문자당 1바이트).
제한: 영어 외의 문자(한글, 일본어, 이모지 등)를 표현할 수 없음.
사용 상황:
영어로만 구성된 단순한 데이터를 다룰 때.
예: 오래된 시스템, 간단한 네트워크 프로토콜.
ASCII가 기본값인 파일 포맷(예: 초기 HTML, 일부 이메일 프로토콜).
유니코드(UTF-8):
전 세계 모든 언어의 문자를 숫자로 매핑합니다.
예: '가' → 44032 → 2진수로 101011001100000
유니코드(Unicode)
범위: 전 세계 모든 문자(언어, 기호, 이모지 등 포함).
UTF-8, UTF-16, UTF-32 같은 방식으로 인코딩.
포함 문자:
영어, 한글, 중국어, 아랍어 등 거의 모든 언어.
이모지(😊, 🚀 등)와 특수 기호도 포함.
장점: 전 세계 문자 지원.
제한: 다국어를 포함한 데이터에서 유용하지만, ASCII보다 저장 크기가 커질 수 있음(특히 UTF-16, UTF-32).
사용 상황:
다양한 언어가 필요한 경우.
예: 한글, 중국어, 일본어 등 다국어 웹사이트.
이모지나 특수 기호를 사용하는 경우.
최신 시스템, 데이터 교환(예: JSON, XML).
범용성과 국제화를 고려한 데이터.
사용 상황은 데이터의 언어, 크기 제한, 그리고 범용성에 따라 결정
💡이미지는 어떻게 저장되나요?
이미지는 픽셀(pixel)이라는 작은 점들의 집합으로 표현됩니다.
픽셀의 색상을 2진수로 저장합니다.
예: 빨간색 → RGB값 (255, 0, 0) → 2진수로 11111111 00000000 00000000
압축 방식(JPEG, PNG 등)을 적용해 데이터를 줄이기도 합니다.
💡소리는 어떻게 저장되나요?
소리는 아날로그 신호를 컴퓨터가 처리할 수 있는 디지털 신호로 변환하여 저장합니다.
샘플링: 소리를 일정 시간 간격으로 쪼개 숫자로 변환.
예: 1초간의 소리를 44,100번 샘플링 → 각 값을 2진수로 저장.
💡비디오는 어떻게 저장되나요?
비디오는 이미지와 소리의 조합입니다.
여러 개의 이미지를 초당 일정한 프레임으로 묶어서 저장합니다.
소리와 동기화하여 함께 재생되도록 합니다.
🤔10진수를 2진수로 빠르게 바꾸는 공식같은거 없나?
bin(13) # 결과: '0b1101'
'0b'는 2진수라는 것을 나타내는 접두사
진법 표기법: 2진수(0b), 8진수(0o), 16진수(0x)
간단한 활용: 비트를 활용한 플래그 관리
컴퓨터가 숫자를 0과 1로 이루어진 2진수로 저장한다는 것은 알고 있죠?
비트 연산자는 이 숫자들을 조작하는 도구입니다.
여기서 비트는 숫자를 이루는 0과 1 하나하나를 뜻해요.
& (AND)
두 숫자의 비트를 비교해서 둘 다 1일 때만 1로 만듭니다.
나머지는 0으로 만듭니다.
예:
1010 (10)
& 1100 (12)
= 1000 (8)
| (OR)
두 숫자의 비트를 비교해서 하나라도 1이면 1로 만듭니다.
예:
1010 (10)
| 1100 (12)
= 1110 (14)
^ (XOR)
두 숫자의 비트를 비교해서 둘이 다르면 1, 같으면 0으로 만듭니다.
예:
1010 (10)
^ 1100 (12)
= 0110 (6)
<< (왼쪽 비트 시프트)
숫자의 비트를 왼쪽으로 밀면서 0을 채워넣습니다.
왼쪽으로 한 번 밀면 숫자가 2배가 됩니다.
예:
1010 (10)
<< 1
= 10100 (20)
>> (오른쪽 비트 시프트)
숫자의 비트를 오른쪽으로 밀면서 빈자리를 0으로 채웁니다.
오른쪽으로 한 번 밀면 숫자가 1/2가 됩니다.
1010 (10)
>> 1
= 0101 (5)
컴퓨터는 2진수, 8진수, 16진수를 사용합니다. Python에서는 숫자 앞에 특별한 기호를 붙여 어떤 진법인지 나타냅니다:
2진수: 0b
8진수: 0o
16진수: 0x