⭐ 시프트연산 쓰는 이유
- 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
반응형
'백엔드' 카테고리의 다른 글
자바 2차원 배열에 대한 고찰... (2) | 2025.05.04 |
---|---|
자바 연산자 우선순위 우선순위 높은 순 -> 낮은 순 정리 (2) | 2025.05.04 |
C언어 vs Java 자료형 상세 비교 (0) | 2025.05.04 |
윈도우 운영체제 기본 명령어 (0) | 2025.05.01 |
Django가 자동으로 검사해주는 것들(유용한 tip!) (0) | 2025.04.25 |