>백엔드 개발 >C++ >C++의 비트 연산 및 응용 기술

C++의 비트 연산 및 응용 기술

WBOY
WBOY원래의
2023-08-22 12:39:171696검색

C++의 비트 연산 및 응용 기술

C++의 비트 연산은 프로그래머가 일반적으로 사용하는 계산 방법입니다. 비트 연산을 사용하여 데이터를 처리하면 일부 복잡한 컴퓨팅 작업을 보다 효율적으로 완료할 수 있습니다. 이 기사에서는 C++의 일반적인 비트 연산 기호와 해당 응용 기술을 소개하고 실제 개발에 사용할 수 있는 몇 가지 예를 소개합니다.

  1. 비트 연산 기호

C++는 이진 비트에서 연산할 수 있는 6개의 비트 연산 기호를 제공하며 그 중 4개는 비트 연산자이고 나머지 2개는 시프트 연산자입니다. 비트 연산 기호는 다음과 같습니다.

& 비트 AND 연산: 두 이진 비트가 모두 1이면 결과는 1이고, 그렇지 않으면 0입니다.

| 비트 OR 연산: 두 바이너리 비트가 모두 0이면 결과는 0이고, 그렇지 않으면 1입니다.

^ 비트별 XOR 연산: 두 개의 이진 비트가 같으면 결과는 0이고, 두 이진 비트가 다르면 결과는 1입니다.

~ 비트 부정 연산: 이진 비트를 부정합니다. 즉, 0은 1이 되고 1은 0이 됩니다.

쉬프트 연산 기호는 다음과 같습니다:

오른쪽 시프트 연산: 이진수를 지정된 자릿수만큼 오른쪽으로 이동하고 상위 비트를 0 또는 1로 채웁니다(원래 숫자가 양수인지 음수인지에 따라 다름).
  1. 응용 기술

비트 연산은 낮은 수준의 컴퓨터 연산에 널리 사용됩니다. 몇 가지 영리한 비트 연산 기술을 통해 많은 효율적인 알고리즘을 구현할 수 있습니다. 다음은 일반적으로 사용되는 몇 가지 기술입니다.

2.1 패리티 결정

이진수의 경우 마지막 숫자가 1이면 숫자는 홀수이고 그 반대도 마찬가지입니다. 따라서 비트 연산을 통해 숫자의 패리티를 결정할 수 있습니다.

모든 정수 n에 대해 n & 1의 결과가 0이면 n은 짝수이고, 그렇지 않으면 홀수라는 의미입니다. 예:

int n = 5;
if( n & 1 ){

cout << "奇数" << endl;

}
else {

cout << "偶数" << endl;

}

2.2 두 숫자의 값을 교환합니다.

두 변수의 값을 교환합니다. , 일반적으로 이 방법은 세 번째 변수를 사용하여 변수 중 하나의 값을 저장한 다음 다른 변수의 값을 여기에 할당하는 것입니다. 그러나 비트 연산을 사용하면 저장을 위한 추가 공간이 필요하지 않으며 비트 XOR 연산을 통해 직접 구현할 수 있습니다. 즉,

int a = 10, b = 20;
a = a ^ b; b ^ a;
a = a ^ b;

실행 후 변수 a의 값은 20, 변수 b의 값은 10이 되어 두 변수의 값이 바뀌게 됩니다.

2.3 이진수에서 1의 개수

이진수에서 1의 개수를 계산할 때 & 연산 + 오른쪽 쉬프트를 사용하여 하나씩 누적해서 풀 수 있습니다. 구체적인 구현 방법은 다음과 같습니다.

int countOne(unsigned int n){

int count = 0;
while (n != 0){

   if (n & 1 == 1){
       count++;
   }
   n = n >> 1; //右移一位

}

return count;
}

2.4 i-를 가져옵니다. 이진수의 번째 비트

왼쪽 시프트 연산을 사용하여 숫자 1을 i - 1비트만큼 왼쪽으로 이동한 다음 비트 AND 연산 &를 사용하여 이진수의 i번째 비트를 얻을 수 있습니다. 구체적인 구현 방법은 다음과 같습니다.

bool getBit(unsigned int n, int i){

return (n & (1 << i)) !=0 ;

}

2.5 이진수의 i번째 비트를 1로 설정

숫자 1을 왼쪽으로 이동합니다. i 비트를 누른 다음 이 이진수를 이동합니다. 숫자와 원래 숫자에 대해 비트별 OR 연산을 수행하여 원래 숫자의 i 번째 비트를 1로 설정합니다.

unsigned int setBit(unsigned int n, int i){

return n | (1 << i);

}

2.6 이진수의 i번째 비트를 0

로 설정합니다. 숫자 1을 왼쪽으로 i비트만큼 이동한 다음 반전하고 병합합니다. 이진수 원래 숫자와 비트별 AND 연산을 수행하여 원래 숫자의 i번째 비트를 0으로 설정합니다.

unsigned intclearBit(unsigned int n, int i){

return n & ~(1 << i);

}

    응용예제
Bit 연산 역시 실제 개발에서 많은 응용이 가능합니다. 일부 관련 작업은 바이트 비트 연산을 통해 더 효율적으로 완료할 수 있습니다. 예를 들어 이미지 처리에서는 이미지의 픽셀을 이진화하는 경우가 많고 상한과 하한을 0과 255로 설정하고 대상 픽셀 값을 0이나 255로 변경합니다. 비트 연산을 사용하면 효율적인 처리가 가능합니다. 코드 예는 다음과 같습니다.

for (int i = 0; i
for (int j = 0; j < img.colnum(); j++){        
    if (img.at(i,j) < threshold){
        img.at(i,j) = 0; //设为0
    }
    else {
        img.at(i,j) = 255; //设为255
    }
}
}

이진수를 연산함으로써 많은 효율적인 알고리즘과 데이터 구조를 구현할 수도 있습니다. 비트맵, 해시 테이블 등과 같은

간단히 말하면 비트 연산은 강력한 도구이며 프로그래밍에 널리 사용됩니다. 비트 연산 기호 및 기법에 대한 숙련도는 효율적인 알고리즘 및 데이터 구조를 구현하고 프로그램 운영 효율성을 향상시키는 데 적극적인 역할을 할 수 있습니다.

위 내용은 C++의 비트 연산 및 응용 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.