C++에서 비트 조작 방법 사용
-
struct
와 결합 된union
을 사용하여 C++에서 효율적인 비트 조작 데이터 구조 구현 -
std::bitset
을 사용하여 C++에서 비트 조작 작업 수행 - 비트 조작을 사용하여 C++에서 두 정수 교체
이 기사에서는 C++에서 비트 조작 방법을 사용하는 방법을 설명합니다.
struct
와 결합 된union
을 사용하여 C++에서 효율적인 비트 조작 데이터 구조 구현
비트 조작은 비트 연산자를 사용하여 정수 변수에서 수행되는 일반적인 작업의 광범위한 이름으로 간주 될 수 있습니다. 비트 시프트 연산자는 더 나은 성능을 제공하면서 숫자에 대한 일반적인 산술 연산을 대체하는 데 자주 사용됩니다. 정수 유형은 일반적으로 주어진 유형의 개별 비트 세트에 다른 정보를 저장하여 복합 데이터 구조를 구현하는 데 사용됩니다. 이 방법은 데이터의 메모리 공간을 최소화하고 액세스 속도를 향상시키는 데 사용할 수 있습니다.
이 경우,union
및struct
키워드를 사용하여 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
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