본문 바로가기
백엔드

비트연산자 <<, >> 사용이유 및 계산법

by cook_code 2025. 5. 4.

 시프트연산 쓰는 이유

  • a * 2 → 곱셈 연산 (산술 연산, 계산 복잡도 높음)
  • a << 1 → 비트 한 칸 왼쪽 이동 = a * 2와 같은 결과지만 비트 이동만 하므로 훨씬 빠르고 가벼움

 실제 속도 차이 

옛날 CPU <<이 더 빠름 곱셈은 복잡한 연산, 시프트는 단순함
현대 CPU 차이 없음 컴파일러와 하드웨어가 모두 최적화됨
고성능 코드 << 권장 의도 표현 + 미세 최적화

 시프트연산 공식

  • a << n
    → a의 비트를 n칸 왼쪽으로 이동,
    2ⁿ을 곱한 효과
  • a >> n
    → a의 비트를 n칸 오른쪽으로 이동,
    2ⁿ으로 나눈 몫 (정수 나눗셈)

 

 👀자바 성능 테스트 실행하였으나 JVM 내부 요인으로 인해 오히려 시프트 연산 속도가 더 느리게 나옴 

현대 CPU 기준 (25.05.04) *와 << 는 차이가 없을 뿐 아니라, 환경에 따라 처리속도가 다르다는 것을 알게됨

⭐ 왼쪽 시프트 <<

int a = 3;     // 0000 0011 (2진수)
int b = a << 1; // 0000 0110 → 6
int c = a << 2; // 0000 1100 → 12

3 << 1 = 3 × 2 = 6
3 << 2 = 3 × 4 = 12

 

⭐ 오른쪽 시프트 >>

int a = 12;     // 0000 1100
int b = a >> 1; // 0000 0110 → 6
int c = a >> 2; // 0000 0011 → 3

12 >> 1 = 12 ÷ 2 = 6
12 >> 2 = 12 ÷ 4 = 3

 

✅ 참고: 음수일 때 (>>는 부호 유지)

int a = -8;           // 1111 1000 (2의 보수)
int b = a >> 1;       // 1111 1100 → -4
 
  • 자바는 >>에서 부호 유지 (최상위 비트 1 유지됨)
  • >>> 사용하면 부호 없이 오른쪽 시프트

⭐ 계산법 참고!

 

[진법변환] 2진수,8진수,10진수,16진수 쉽게 변환하는 방법 알아보기!

2024버전 NEW 진법변환 글을 작성했어요! 2진법~16진법, 소수점이 있는 숫자 진법 변환까지 단골질문에 ...

blog.naver.com

 

 

반응형