English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
비트 연산자를 배웁니다. ++이 튜토리얼에서, 예제를 통해 C
중의 비트 연산자. ++C
중에서 비트 연산자는 단일 비트 수준의 정수 데이터에 연산을 수행합니다. 이러한 작업에는 테스트, 설정 또는 실제 비트를 이동하는 작업이 포함됩니다. 예를 들어, a & b;
a | b; ++이것은 C6중에 포함된
비트 연산자 목록을 포함합니다. | 연산자 | 이름 | 설명 |
---|---|---|---|
예제 | & | 비트 AND | 두 개의 연산자에 동시에 존재하는 경우, 이진 AND 연산자는 결과에 한 비트를 복사합니다. 12을 얻습니다. 1100 |
(A & B)을 얻습니다. | 비트 OR | | | 하나의 연산자에 존재하는 경우, 이진 OR 연산자는 결과에 한 비트를 복사합니다. 61(A ^ B)을 얻습니다.11 1101 |
(A | B)을 얻습니다. | ^ | 비트 XOR | 하나의 연산자에만 존재하며 두 개의 연산자에 동시에 존재하지 않는 경우, 이진 XOR 연산자는 결과에 한 비트를 복사합니다. 49(A ^ B)을 얻습니다.11 0001 |
즉, 00 | 비트 보수 | ~1이진 보드 컴플리먼스 연산자는 일원 연산자로, "전환" 비트 효과를 가지고 있으며, 0이1, | 0으로 바뀝니다. -61(~A )을 얻습니다. 110즉110 00 |
<< | 좌이진수의 보드 컴플리먼스 형태입니다. | 왼쪽 이동 | 이진 왼쪽 이동 연산자입니다. 왼쪽 연산자의 값을 왼쪽 연산자가 지정한 비트 수만큼 왼쪽으로 이동합니다. 2 A >> 24A << 1111 0000 |
>> | 0, 즉 | 오른쪽 이동 | 이진 오른쪽 이동 연산자입니다. 왼쪽 연산자의 값을 오른쪽 연산자가 지정한 비트 수만큼 오른쪽으로 이동합니다. 2 A >> 15을 얻습니다. 1111 |
즉, 0000
이 연산자는 컴퓨터 CPU의 수학 논리 장치(ALU)가 비트 수준에서 수학 연산을 수행하기 때문에 필요합니다.주의:
비트 압축(&)연산자1두 연산자 모두1아니면 0을 반환합니다.
아래 테이블은 비트 AND 연산자의 작동 방식을 설명합니다. a와 b는 두 개의 바이너리 값만 가져지는 경우를 가정합니다.10과의 연산자.
a | b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
주의:비트 AND 연산자는 "트루 테이블"로 불립니다.
두 정수12와25비트 압축 연산:
12 = 00001100 (이진) 25 = 00011001 이진) //12와25비트 압축 연산 00001100 & 00011001 _________ 00001000 = 8 (십진)
#include <iostream> using namespace std; int main() { //변수 선언 int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a & b = " << (a & b) << endl; return 0; }
출력 결과
a = 12 b = 25 a & b = 8
위 예제에서, 두 개의 변수 a와 b를 선언했습니다. 여기서, 이 줄을 주의해 주세요.
cout << "a & b = " << (a & b) << endl;
여기서, 변수 a와 b 사이에서 비트 압축(&) 연산을 수행합니다.
만약 최소한 하나의 연산자가1하나라도 0이 아니면1이면 비트 OR(|) 연산자가
의 진리 표현은 비트 OR 연산자의 작동 방식을 보여줍니다. 가정하면a와b이진 값만을 취할 수 있는 두 개의 연산자(즉1또는 0)의연산자.
a | b | a | b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
두 정수12와25의 비트 OR 연산:
12 = 00001100 (이진) 25 = 00011001 이진) //12와25의 비트 OR 연산 00001100 OR 00011001 _________ 00011101 = 29 (십진)
#include <iostream> int main() { int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a | b = " << (a | b) << endl; return 0; }
출력 결과
a = 12 b = 25 a | b = 29
에서비트 OR에서 a = 12와 b = 25에서29는
하나만이 0이면1이면 비트 XOR ^ 연산자가1. 그러나 두 연산자 모두 0이거나 두 연산자 모두1이면 결과는 0입니다.
의 진리 표현은 비트 OR 연산자의 작동 방식을 보여줍니다. 가정하면a와b이진 값만을 취할 수 있는 두 개의 연산자(즉1또는 0)의연산자.
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
두 정수12와25의 비트 XOR 연산:
12 = 00001100 (이진) 25 = 00011001 이진) //12와25의 비트 이이어 연산 00001100 ^ 00011001 _________ 00010101 = 21 (십진)
#include <iostream> int main() { int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a ^ b = " << (a ^ b) << endl; return 0; }
출력 결과
a = 12 b = 25 a ^ b = 21
a = 12와 b = 25의 비트 이이어 연산 결과는21는
비트 보수 연산자는 일원 연산자입니다(단일 연산자에만 영향을 미칩니다). ~로 표시하여 이진 수10을 변경하면 0을 변경하면1는
주의해야 할 것은 어떤 정수 N의 비트 보수는 -(N+1)。예를 들어
예를 들어 정수35. 규칙에 따르면35의 비트 보수는-(35 +1) = -36. 지금, 올바른 답이 되었는지 확인해 보겠습니다.
35 = 00100011 이진) // 비트 보수 연산자를 사용하여 ~ 00100011 __________ 11011100
위의 예제에서 우리는00100011(35의 비트 보수는11011100입니다.220는
하지만, 주의해야 할 것은 결과를 직접 십진수로 변환하여 필요한 출력을 얻을 수 없다는 것입니다. 이는 이진 결과가11011100도 동일합니다.-36는
이를 이해하기 위해 먼저 계산해야 합니다.-36의 이진 출력.2을 사용하여 음수의 이진수를 계산합니다.
이진 계산에서1의 보수를 0으로 변경하면1만약 우리가10을 추가하면1의 보수 결과에1그렇게 하면 원래 숫자의2의 보수.
예를 들어
36 = 00100100 (이진) 1의 보수 = 11011011 2의 부호(즉 11011011 + 1 _________ 11011100
여기서 우리는36의2의 부호(즉-36)는11011100. 이 값은35의 비트 반전.
따라서 우리는 말할 수 있습니다35의 비트 반전은-36는
#include <iostream> int main() { int num1 = 35; int num2 = -150; cout << "~(" << num1 << ") = " << (~num1<< endl; cout << "~(" << num2 << ") = " << (~num2<< endl; return 0; }
출력 결과
를 초기화합니다.35) = -36 를 초기화합니다.-150) = 149
위의 예제에서 우리는 두 개의 정수 변수 num1와 num2를 사용하여 각각의 값을35와-150을 초기화합니다.
그런 다음 우리는 코드(~num1)와 (~num2) 그들의 비트 반전을 계산하고 화면에 표시합니다.
35의 비트 반전 = - (35 + 1) = -36 즉 ~35 = -36 -150의 비트 반전 = - (-150 + 1) = - (-149) = 149 즉 ~(-150) = 149
이것이 우리가 출력에서 얻은 것입니다.
C ++프로그래밍에서는 두 개의 이동 연산자가 있습니다:
이동 연산자 >>
이동 연산자 <<
이동 연산자는 모든 비트를 지정된 수의 비트로 오른쪽으로 이동시킵니다. >>으로 표시됩니다.
우리가 어떤 숫자를 오른쪽으로 이동할 때마다가장 낮은 유효 비트로 버려지고가장 높은 유효 비트로 대체됩니다.
위 그림에서 볼 수 있듯이, 우리는4비트 숫자. 우리가 이에 대해1비트로 대체됩니다.
결과적으로 가장 오른쪽 비트는 버려지고(Discribed) 가장 왼쪽 비트는 공간을 유지합니다. 이 공간은0대체 비트(Replacement Bit)로 대체됩니다.
이동 연산자는 모든 비트를 지정된 수의 비트로 왼쪽으로 이동시킵니다. <<으로 표시됩니다.
위 그림에서 볼 수 있듯이, 우리는4비트 숫자. 우리가 이에 대해1비트를 왼쪽으로 이동시키면, 각 단일 비트는 왼쪽으로 이동합니다1비트로 대체됩니다.
결과적으로 가장 왼쪽 비트는 버려지고(Discribed) 가장 오른쪽 비트는 공간을 유지합니다. 이 공간은0대체 비트(Replacement Bit)로 대체됩니다.
#include <iostream> int main() { //두 정수 변수를 선언합니다 int num = 212, i; //우이동 연산 cout << "우이동:\" << endl; //for 루프를 사용하여 num을 0비트에서 오른쪽으로 이동시킵니다3비트 for (i = 0; i < 4; i++) { cout << "212 >> " << i << " = " << (212 >> i) << endl; } //좌이동 연산 cout << "\n좌이동:\ //for 루프를 사용하여 num을 0비트에서 왼쪽으로 이동시킵니다3비트 for (i = 0; i < 4; i++) { cout << "212 << " << i << " = " << (212 << i) << endl; } return 0; }
출력 결과
오른쪽 이동: 212 >> 0 = 212 212 >> 1 = 106 212 >> 2 = 53 212 >> 3 = 26 왼쪽 이동: 212 << 0 = 212 212 << 1 = 424 212 << 2 = 848 212 << 3 = 1696
위 프로그램의 출력에서, 어떤 숫자라도 다음과 같이 추론할 수 있습니다:N따라서, 오른쪽 이동 연산자의 결과는 다음과 같습니다:
N >> 0 = N N >> 1 = (N >> 0) / 2 N >> 2 = (N >> 1) / 2 N >> 3 = (N >> 2) / 2
그리고 다른 것들도 있습니다.
따라서, 왼쪽 이동 연산자의 결과는 다음과 같습니다:
N << 0 = N N << 1 = (N << 0) * 2 N << 2 = (N << 1) * 2 N << 3 = (N << 2) * 2
그리고 다른 것들도 있습니다.
따라서, 우리는 다음과 같은 결론을 내릴 수 있습니다.
N >> m = [ N >> (m-1) ] / 2 N << m = [ N << (m-1) ] * 2