C/C++ 알고리즘

C와 C++의 비트 조작

이 레슨에서는 정수의 비트를 켜고, 끄고, 뒤집고, 확인해서 여러 개의 켜짐/꺼짐 상태를 저장합니다.

소개

정수의 각 비트에는 참이나 거짓 값 하나를 저장할 수 있습니다. 그래서 부호 없는 정수 하나에 플래그(flags)라고 부르는 독립적인 켜짐/꺼짐 옵션을 여러 개 담을 수 있습니다. 이런 비트 마스크(bit mask) 기법은 시스템 프로그래밍과 임베디드 분야에서 아주 흔합니다.

핵심 정리

  • 빈 입력, 요소 하나, 중복 값, 이미 정렬된 데이터로 테스트하세요.
  • 먼저 코드가 올바르게 동작하게 만든 다음 최적화하세요.
  • 실제 코드에서는 표준 라이브러리의 이미 만들어진 함수를 우선 쓰세요.

C와 C++ 코드 예제

C
실행 →
main.c
#include <stdio.h>

int main(void) {
    unsigned flags = 0;
    flags |= 1u << 1;
    flags |= 1u << 3;
    flags ^= 1u << 1;
    printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
실행 결과
flags=8 bit3=1
C++
실행 →
main.cpp
#include <bitset>
#include <iostream>

int main() {
    std::bitset<4> flags;
    flags.set(1);
    flags.set(3);
    flags.flip(1);
    std::cout << "flags=" << flags
              << " bit3=" << flags.test(3) << '\n';
}
실행 결과
flags=1000 bit3=1

C와 C++ 비교

식 1u << n은 n번 비트만 1인 숫자를 만듭니다. |= 연산자는 비트를 켜고, ^=는 뒤집으며, (flags >> 3) & 1u는 3번 비트를 확인합니다. 1번과 3번 비트를 켠 뒤 1번 비트를 다시 뒤집으면 3번 비트만 켜져 있으므로 flags는 8입니다. 비트 이동 결과를 예측할 수 있도록 부호 없는(unsigned) 타입을 쓰세요. C++의 std::bitset은 set(), flip() 같은 명시적인 메서드를 제공하고 값을 이진수로 출력합니다.

C

반복문, 포인터, 길이, 임시 버퍼를 모두 명시적으로 작성합니다.

C++

반복자와 표준 알고리즘이 처리 방식과 데이터를 저장하는 방식을 분리합니다.

연습 문제

두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.

  • 종이에 비교 과정을 하나씩 따라가 보세요.
  • 중복 값과 아주 크거나 작은 값으로 테스트해 보세요.
  • 직접 작성한 코드의 실행 시간을 재고 표준 라이브러리와 비교해 보세요.

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지