English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Manuale di base di C++

Controllo di flusso in C++

Funzione di C++

Array e stringhe in C++

Strutture dati in C++

Classi e oggetti in C++

Puntatore di C++

Ereditarietà di C++

Manuale di STL di C++

Manuale di riferimento di C++

Operatori a livello di bit in C++

In questo tutorial, impareremo gli operatori a livello di bit in C++ attraverso esempi.

In C++, gli operatori a livello di bit eseguono operazioni su dati interi a livello di bit singolo. Queste operazioni includono test, impostazione o spostamento di bit reali. Ad esempio:

a & b;
a | b;

Ecco l'elenco dei 6 operatori a livello di bit inclusi in C++.

OperatoreNome
DescrizioneEsempio
&Operatore AND a livello di bit
L'operatore AND binario copia un bit nel risultato se esiste negli operandi contemporaneamente.(A & B) restituirà 12, ossia 0000 1100
|OR bit
L'operatore OR binario copia un bit nel risultato se esiste in uno degli operandi.(A | B) restituirà 61, ossia 0011 1101
^Operatore XOR a livello di bit
L'operatore XOR binario copia un bit nel risultato se esiste in uno degli operandi ma non in entrambi.(A ^ B) restituirà 49, ossia 0011 0001
~complemento a dueL'operatore di complemento a due binario è un operatore unario che ha l'effetto di 'inversione' dei bit, ossia 0 diventa 1 e 1 diventa 0.(~A) restituirà -61, ossia 1100 0011, che è la rappresentazione in complemento a due di un numero binario con segno.
<<Spostamento a sinistraOperatore di spostamento a sinistra binario. Il valore dell'operando di sinistra si sposta a sinistra di un numero di posizioni specificato dall'operando di destra.A << 2 restituirà 240, ossia 1111 0000
>>Spostamento a destraOperatore di spostamento a destra binario. Il valore dell'operando di sinistra si sposta a destra di un numero di posizioni specificato dall'operando di destra.A >> 2 restituirà 15, ossia 0000 1111

Questi operatori sono necessari perché l'unità logica aritmetica (ALU) del CPU del computer esegue operazioni aritmetiche a livello di bit.

Attenzione:Gli operatori a livello di bit possono essere usati solo con i tipi di dati char e int.

1. Operatore AND a livello di bit in C++

L'operatore AND a livello di bit restituisce 1 solo quando entrambi gli operandi sono 1. Altrimenti, restituisce 0.

Esempio che mostra come funziona l'operatore AND a livello di bit. Supponiamo che a e b siano operandi che possono solo prendere valori binari, ovvero 1 e 0.

aba & b
000
010
100
111

a & bAttenzione:

La tabella è chiamata "tabella di verità" per l'operatore AND bit.

12 = 00001100 (binario)
25 = 00011001 (binario)
// Operazione AND bit tra 12 e 25
     00001100
& 00011001
     _________
     00001000 = 8 (decimale)

Esempio 1: Operatore AND bit

#include <iostream>
using namespace std;
int main() {
    // Dichiarazione variabili
    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

Nell'esempio sopra, abbiamo dichiarato due variabili a e b. Nota questa riga:

cout << "a & b = " << (a & b) << endl;

Qui eseguiamo l'operazione AND bit tra le variabili a e b.

2. Operatore OR bit | in C++

L'operatore OR bit | restituisce 1 se almeno uno degli operandi è 1. Altrimenti restituisce 0.

Ecco un esempio di come funziona l'operatore OR bit. Supponiamo cheaebper due valori binari (cioèo 0) delOperando.

aba | b
000
011
101
111

Vediamo due interi12e25Operazione OR bit tra

12 = 00001100 (binario)
25 = 00011001 (binario)
// Operazione OR bit tra 12 e 25
    00001100
| 00011001
    _________
    00011101 = 29 (decimale)

Esempio 2: Operatore OR bit

#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

inOR bitCon a = 12 e b = 25 si ottiene 29.

3. Operatore XOR bit (^) in C++

L'operatore XOR bit ^ restituisce 1 solo quando uno dei due operandi è 1. Tuttavia, se entrambi gli operandi sono 0 o entrambi sono 1, il risultato è 0.

Ecco un esempio di come funziona l'operatore OR bit. Supponiamo cheaebper due valori binari (cioèo 0) delOperando.

aba ^ b
000
011
101
110

Vediamo l'operazione XOR bit tra due interi 12 e 25:

12 = 00001100 (binario)
25 = 00011001 (binario)
// Operazione XOR bit tra 12 e 25
    00001100
^ 00011001
    _________
    00010101 = 21 (decimale)

Esempio 3: Operatore XOR bit

#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

L'operazione di XOR bit tra a = 12 e b = 25 produce 21.

4. Operatore di complemento a due in C ++

l'operatore di complemento a due è un operatore unario (che agisce su un singolo operando). Rappresentato con ~, cambia il numero binario 1 in 0 e 0 in 1.

complemento a due

È importante notare che il complemento a due di qualsiasi intero N è uguale a -(N+1). Ad esempio

Ad esempio, l'intero35. Secondo le regole,35il complemento a due dovrebbe essere-(35 +1) = -36. Ora, vediamo se otteniamo la risposta corretta.

35 = 00100011 (binario)
// Operatore di complemento a due
~ 00100011 
 __________
  11011100

Nell'esempio sopra, abbiamo determinato00100011(35)complemento a due è11011100. Ecco, se convertiamo il risultato in decimale, otteniamo220.

Ma è importante notare che non possiamo convertire direttamente il risultato in decimale per ottenere l'output desiderato. Questo perché il risultato binario11011100è uguale a-36.

Per comprendere questo, dobbiamo prima calcolare-36uscita binaria. Utilizziamo il complemento a due per calcolare il numero binario di numeri interi negativi.

Complemento a due

Nel calcolo binario, il complemento a uno cambia 0 in 1 e 1 in 0. E se aggiungiamo 1 al risultato del complemento a uno, otteniamo il complemento a due del numero originale.

Ad esempio

36 = 00100100 (binario)
1's complement = 11011011 
Complemento a due:   
11011011
 + 1
_________
11011100

Ecco, possiamo vedere che il complemento a due di 36 (ovvero -36) è 11011100. Questo valore è uguale al complemento a due di 35.

Quindi, possiamo dire che il complemento a due di 35 è -36.

Esempio 4: Complemento a due

#include <iostream>
int main() {
    int num1 = 35;
    int num2 = -150;
    cout << "~(" << num1 << ") = " << (~num1) << endl;
    cout << "~(" << num2 << ") = " << (~num2) << endl;
    return 0;
}

输出结果

~(35) = -36
~(-150) = 149

Nell'esempio sopra, abbiamo dichiarato due variabili intere num1 e num2 e le abbiamo inizializzate rispettivamente con i valori 35 e -150.
Poi calcoliamo rispettivamente i complementi a due di ~num1 e ~num2 con il codice e li mostriamo sullo schermo.

35的按位补ode = - (35 + 1) = -36
ovviamente ~35 = -36
-150的按位补码 = - (-150 + 1) = - (-149) = 149
即 ~(-150) = 149

这正是我们在输出中得到的。

C ++移位运算符

C ++编程中有两个移位运算符:

  • 右移运算符 >>

  • 左移运算符 <<

1、C ++右移运算符(>>)

右移运算符将所有位向右移一定数量的指定位。用>>表示。

当我们向右移动任何数字时,最低有效位将被丢弃,而最高有效位将被零替换。

右移一位

从上图可以看到,我们有一个4位数字。当我们对其执行一位右移操作时,每个单独的位向右移1位。

结果,最右边的位被丢弃(Discarded),而最左边的位保持为空。此空位由0代替(Replacement Bit)。

2、C ++左移运算符

左移位运算符将所有位向左移位一定数量的指定位。用<<表示。

左移一位

从上图可以看到,我们有一个4位数字。当我们对其执行1位左移操作时,每个单独的位向左移1位。

结果,最左边的位被丢弃(Discarded),而最右边的位保持为空。此空位由0代替(Replacement Bit)。

示例5:移位运算符

#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左移:" << endl;
    //使用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

etc.

Allo stesso modo, il risultato dell'operatore di shift a sinistra è:

N << 0 = N
N << 1 = (N << 0) * 2
N << 2 = (N << 1) * 2
N << 3 = (N << 2) * 2

etc.

Di conseguenza, possiamo trarre la seguente conclusione,

N >> m = [ N >> (m-1) ] / 2
N << m = [ N << (m-1) ] * 2