C++에서 비트 조작 방법 사용

Jinku Hu 2023년10월12일
  1. struct와 결합 된union을 사용하여 C++에서 효율적인 비트 조작 데이터 구조 구현
  2. std::bitset을 사용하여 C++에서 비트 조작 작업 수행
  3. 비트 조작을 사용하여 C++에서 두 정수 교체
C++에서 비트 조작 방법 사용

이 기사에서는 C++에서 비트 조작 방법을 사용하는 방법을 설명합니다.

struct와 결합 된union을 사용하여 C++에서 효율적인 비트 조작 데이터 구조 구현

비트 조작은 비트 연산자를 사용하여 정수 변수에서 수행되는 일반적인 작업의 광범위한 이름으로 간주 될 수 있습니다. 비트 시프트 연산자는 더 나은 성능을 제공하면서 숫자에 대한 일반적인 산술 연산을 대체하는 데 자주 사용됩니다. 정수 유형은 일반적으로 주어진 유형의 개별 비트 세트에 다른 정보를 저장하여 복합 데이터 구조를 구현하는 데 사용됩니다. 이 방법은 데이터의 메모리 공간을 최소화하고 액세스 속도를 향상시키는 데 사용할 수 있습니다.

이 경우,unionstruct키워드를 사용하여 32 비트를 저장할 수있는uint32_t유형 정수를 저장하기 위해BitSet이라는 특수 객체를 구현합니다. union은 여러 데이터 멤버를 가질 수있는 C++에서 특수한 종류의 클래스를 정의하지만 그 중 하나만 주어진 시간에 유효한 값을 저장할 수 있습니다. 결과적으로 클래스 개체는 일반적으로 가장 큰 데이터 멤버의 양을 차지합니다. 또한 다음 예제는struct멤버 표기법을 사용하여 액세스 할 수있는 정수의 미리 정의 된 비트 세트를 만드는 비트 필드의 사용법을 보여줍니다. 결과BitSet은 각 멤버에 대한 일반 할당 작업을 사용하거나 비트 조작을 사용하여 조작 할 수 있습니다.

#include <iostream>

using std::cout;
using std::endl;

union BitSet {
  struct {
    uint32_t b1 : 8;
    uint32_t b2 : 8;
    uint32_t b3 : 8;
    uint32_t b4 : 8;
  };
  uint32_t bb;
};

int main() {
  BitSet set1 = {'a', 'b', 'c', 'd'};
  cout << set1.b1 << " " << set1.b2 << " " << set1.b3 << " " << set1.b4 << endl;

  set1.bb = 'a' | ('b' << 8) | ('c' << 16) | ('d' << 24);

  cout << set1.b1 << " " << set1.b2 << " " << set1.b3 << " " << set1.b4 << endl;

  return EXIT_SUCCESS;
}

출력:

97 98 99 100
97 98 99 100

std::bitset을 사용하여 C++에서 비트 조작 작업 수행

std::bitset은 C++ 표준 라이브러리의 일부이며 고정 된 크기의 비트 시퀀스를 나타냅니다. 비트 마스크를 사용하는 정수 유형에 대한 원시 연산보다 활용하기 쉬운 직관적 인 생성자 및 비트 수정 자 / 액세스 기능을 제공합니다. std::bitset은 모든 비트 연산자를 지원하고 유사한 객체를 비교합니다. 다음 코드 스 니펫은std::bitset 객체에 대한 몇 가지 기본 작업을 보여줍니다.

#include <bitset>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  std::bitset<8> bs1("11001001");
  std::bitset<8> bs2(~bs1);

  cout << "bs1        : " << bs1 << endl;
  cout << "bs2        : " << bs2 << endl;
  cout << "bs1 XOR bs2: " << (bs1 ^ bs2) << endl;
  cout << "bs1 reset  : " << bs1.reset() << endl;

  return EXIT_SUCCESS;
}

출력:

bs1        : 11001001
bs2        : 00110110
bs1 XOR bs2: 11111111
bs1 reset  : 00000000

비트 조작을 사용하여 C++에서 두 정수 교체

산술 연산 외에도 일부 비트 연산자는 많은 일반적인 프로그래밍 문제를 해결하는 유용한 기능을 제공합니다. 한 가지 예는 XOR 비트 연산자를 사용하여 두 개의 정수 변수를 교환하는 것입니다. XOR 스왑은 임시 변수를 사용하는 일반 스왑보다 더 나은 성능을 보장하지 않으며 최신 데스크톱 및 모바일 애플리케이션 프로세서에서 더 느릴 수도 있습니다.

#include <bitset>
#include <iostream>

using std::cout;
using std::endl;

void SwapIntegers(int &x, int &y) {
  y = x ^ y;
  x = x ^ y;
  y = x ^ y;
}

int main() {
  int k = 5;
  int m = 9;

  cout << "k: " << k << " m: " << m << endl;
  SwapIntegers(k, m);
  cout << "k: " << k << " m: " << m << endl;

  return EXIT_SUCCESS;
}

출력:

k: 5 m: 9
k: 9 m: 5
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook