Ciao e Benvenuto. Parliamo di operatori bit per bit.
Ti abbiamo mostrato un piccolo assaggio di questo nella lezione precedente quando abbiamo parlato degli operatori di
assegnazione perché gli operatori di assegnazione hanno tutti questi incarichi composti
in cui puoi eseguire un'operazione come un'addizione e quindi anche assegnare.
Puoi fare le stesse cose con questi operatori di tipo.
Ma andiamo più nel dettaglio e ti diciamo esattamente cosa sono.
Quindi c offre operatori logici bit per
bit e operatori di spostamento. Quei termini potrebbero essere completamente all'oscuro.
Sembrano operatori logici, ma sono abbastanza diversi. Non eseguono alcun tipo di
valutazione booleana. Non valutano vero o falso.
Sembrano la e commerciale, le 2 or, ma non
eseguono alcun tipo di valutazione booleana.
Quello che stanno facendo è che stanno operando su bit, all'interno di valori interi.
E quindi potresti chiederti perché diavolo vorresti mai farlo? Bene, non è utilizzato
nella maggior parte dei programmi. È più una tecnica avanzata.
Anche se questa è una classe per principianti. Fanno parte degli operatori e gli operatori sono un concetto per principianti.
Quindi li affronterò, ma non ci concentreremo necessariamente su di loro.
Ti darò alcuni esempi, ti mostrerò come puoi usarli.
Ma non sarai un esperto in questo dopo questa conferenza.
Ma il modo in cui sono utili e il motivo per cui vorresti davvero usarli è
perché puoi memorizzare un bel po 'di dati.
Quindi ci sono operandi bit per bit chiamati e, e commerciale e bit per bit o che
è una o solo una singola barra parallela.
Cerca di non confonderli di nuovo con gli operatori logici.
Gli operatori logici ne hanno 2, e commerciale, che è una e.
Gli operatori bit per bit hanno solo un singolo. Quindi solo una e commerciale o solo un o.
Quindi quello che faranno è testare e impostare singoli bit all'interno
di una variabile intera. Cos'è un po '?
Sappiamo che un po 'è un modo per misurare i dati.
Ma un po 'è essenzialmente solo un valore 0 o 1.
E 8 di questi costituiscono un byte. Quindi un po 'è uno 0 o 1.
E quello che puoi fare è un numero intero,
ricorda, a seconda del sistema che stai utilizzando, potrebbe essere di 8 byte.
E così potresti accendere e spegnere ogni bit.
E quando dico accendi o spegni, sto dicendo che puoi farli essere uguali a 1 o 0.
E poi puoi usare quei bit per dirti qualcosa.
Quindi puoi memorizzare molti dati facendo in modo che i bit rappresentino un qualche tipo di dati.
Ecco perché uno dei motivi per cui il computer
utilizza bit in 1 e 0 e numeri binari per eseguire operazioni perché è possibile
memorizzare molti dati. Ora esattamente
ciò che significa è ecco un esempio. Potresti usare una singola variabile intera.
Ancora una volta, un numero intero è un numero, un numero intero rappresenta da 4
a 8 byte a seconda del sistema in esecuzione.
Ciò significa che se ci sono 4 byte significa che ci sono 32 bit.
Ci sono 32 0 o 1 valori.
Quindi puoi usare tutti quei bit per rappresentare qualcosa.
Quindi, ad esempio, se vuoi memorizzare i singoli caratteri di una persona, potresti avere solo
1 bit, dirti se la persona è maschio
o femmina dicendo che 1 è uguale a maschio 0 è uguale a femmina.
Devi solo accenderlo o spegnerlo.
Quindi puoi usare 3 bit per specificare
se la persona può parlare francese, tedesco o italiano.
Quindi il bit 1 potrebbe rappresentare il francese. Se non è 1
0, significa che non parlano francese.
Se il tedesco è 0 significa che non parlano tedesco.
Se è 1, significa che parlano tedesco. Quindi disattivando e attivando questi bit,
impostandoli da 1 a 0, puoi rappresentare molti dati.
Potresti avere un altro bit per registrare se lo stipendio della persona è di 50.000 o più.
Se è 1, è vero, sì, lo è. 0 falso.
Quindi fondamentalmente abbiamo appena specificato qui.
In realtà dice 4, ma in realtà abbiamo specificato 5 bit di dati, solo
5 se ne abbiamo o meno 32 o se ne abbiamo
64, ma ne abbiamo usati solo 5 e siamo in grado di
rappresentare se una persona è o meno una donna o un maschio , indipendentemente dal fatto che
parlino francese, tedesco o italiano o tutti e 3 o l'uno o l'altro.
E indipendentemente dal fatto che stiano guadagnando più di $ 50.000.
Possiamo rappresentare tutti quei dati nei nostri bit.
Ed è qui che tornano utili gli operatori bit per bit.
Ora che sappiamo come possiamo usare i bit per memorizzare
molti dati diversi. Parliamo di quei numeri binari.
Sappiamo che un numero binario è solo un numero che include 1 e 0.
Ed è per questo che è vantaggioso da usare. Operatori di bit in un numero intero, il numero
può essere di qualsiasi lunghezza.
I seguenti sono esempi di numeri binari, solo 0 e 1.
Quindi hai visto questo 0 1 0 1 0 1 1 0 1 0 1 0.
E ricorda che un byte è di 8 bit.
Un numero intero è solitamente di 4 byte sulla maggior parte delle piattaforme.
Dipende dall'architettura, ma principalmente 32 bit.
Quindi hai 32 valori che puoi memorizzare con 1 e 0 per indicare on o off.
Numeri binari, ancora una volta ogni numero binario ha un valore decimale
corrispondente, quindi è necessario capire come convertire il binario in decimale.
Esempi qui 1 è uguale a 1, 1 0 è 2, 1 1
è 3, queste sono semplici conversioni.
Di nuovo, di solito hanno più bit, 1 0 1 0 1 1 1.
Il modo in cui si desidera convertire i numeri binari in
un numero decimale è che si desidera guardare
ogni posizione nel byte con il bit corrispondente al bit e quindi utilizzare la potenza di 2.
Quindi per ogni cifra moltiplichi la cifra per il suo valore
di posizione usando la potenza di 2. E poi aggiungi l'intero progetto per ottenere il risultato finale.
Quindi i valori di posizione e un numero binario sono le potenze di 2.
Quindi la prima posizione sarebbe il valore 2 0,
che, in altre parole, sarebbe 1.
E poi la seconda posizione sarebbe il valore di 2 alla prima potenza che è
2, 2 a 2 sarebbe 4, 2 a 3 sarebbe 8,
2 a 4 sarebbe 16. E continui a
farlo ancora e ancora. E quindi è più facile capire se vedi un bell'esempio.
E quindi qui abbiamo un numero binario di 0 1 1 0 1 0 0 1.
L'equivalente decimale è 105.
Il modo in cui converti è che inizi dal lato destro per ogni bit
e moltiplichi fino alla potenza di 2 a seconda che il bit sia 0 1.
Quindi, se partiamo completamente a destra, abbiamo 1.
Quindi diciamo 1 per 1 e manteniamo quello 1. Quindi il successivo 1, la
seconda posizione è 0 per 2 0. Quindi 0 volte 4, 1
volte 8, 0 volte 16,1 volte 32, 1
volte 64 e 0 volte 28.
E aggiungi tutti questi e ottieni il risultato di 105.
Questo è un modo per convertire. Puoi anche convertirlo da sinistra
a destra moltiplicando per 2 e quindi aggiungendo 1 o aggiungendo 0
a seconda di quale sia il bit successivo. Quindi, ad esempio, puoi
anche se vai da sinistra a destra,
inizi con 1 perché 0 non ha importanza.
Quindi il secondo bit che va da sinistra a destra, hai 1.
Il terzo bit, hai 1 per 2 più
1, quindi hai 3.
E ancora, moltiplichi per 2 quindi dici 3 per 2 più 0 che è 6.
6 per 2 più 1, che è 13.
13 per 2 fa 26.
26 per 2 fa 52
per 2, che è 104 più 1.
Quindi moltiplica di nuovo per 2 e poi aggiungi 1. Un altro esempio, ancora una volta,
da destra a sinistra di solito è un po 'più facile.
Ecco 1 0 0 1 1 1 0 0.
E questo si converte in 156 perché dici di nuovo 0 per
1, 0 per 2, 1 per 4, 1 per 8, 1
per 16 e così via e
poi aggiungi tutti insieme, che è 4 8 12 16 28 più 128 è 156 .
E ancora, se vai da sinistra a destra moltiplichi per 2 aggiungi 1.
Quindi abbiamo iniziato per 1. Dire 1
2 4 9, 4
per 2 più 1, 9 per
2 è 18 più 1 è 19 per
2, 38 più 1 è 39 per 2 che
è 78 per 2 che è 156.
Quindi questa è una rapida dimostrazione di come convertire
un binario in decimale. Ora convertendo decibel in binario,
di solito uso solo una conversione sul
web se sei veramente interessato a questo. Ma puoi prendere questi numeri binari e quindi eseguire operatori
bit per bit Quindi diamo un'occhiata agli operatori bit per bit.
Quindi gli operatori bit per bit sono riassunti qui. E ancora, un altro bel tavolo che
ho trovato online, ma sembrano simili agli operatori logici. Ma ancora una volta, non confonderli.
Quindi la e commerciale di per sé è un operatore binario e.
E quindi ciò che sta facendo è copiare un po 'nel risultato
se esiste in entrambi gli operandi. Quindi, se entrambi sono veri, copierà
un po '.
Quindi se aeb è uguale a 12, avrai
una rappresentazione binaria di 0 0 0 0 1 1 0 0.
Quindi aeb sarebbe
quel numero. Passeremo attraverso alcuni esempi.
Un binario o copia un bit se esiste in uno degli operandi,
quindi aob copierà un bit
se esiste in uno degli operandi. Quindi, se uno degli
operandi è uguale a 1, verrà copiato un bit.
E poi il binario xor, questo è l'esclusivo o.
Questo copierà il bit se è impostato in 1 operando ma non in entrambi.
Quindi, se hai un vero, ma solo
1 vero e usi la carota per rappresentarlo sulla tastiera,
allora copierà un po 'e dirà che è
vero,
binario 1 complemento.
Quindi, di nuovo, stiamo ottenendo i dati binari qui perché stiamo parlando di bit. Quindi si spera, complemento
di 1.
L'operatore è unario e ha l'effetto
di capovolgere i bit, in pratica negando e togliendo il monitor.
Quindi un esempio qui è che se dici tilde
a, stai applicando l'operatore di complemento 1s.
E se è uguale a 61 negativo, sarà 1 1 0 0 0 0 1.
Quindi, se dovessi convertire effettivamente quel numero binario
in decimale, che è un numero negativo e il primo
numero è il segno. Quindi ti dico che è un segno.
E poi dici 1 2 4 8 16 33 e
poi 61, quindi è così che sarebbe rappresentato.
Quindi esaminerò esempi più concreti di questo.
Ma fondamentalmente, se hai un numero binario, a è inizialmente un numero binario che è 0 0 1
1 1 1 0 0 che è 60 e fornisci
il capovolgimento che fondamentalmente si trasformerà in 61
negativo, che è 1 1 0 0 0 0 0 0 0 0 0 1 1.
Quindi questo è il risultato delle variabili che sono effettivamente impostate. Quindi, di nuovo, presumo che
a abbia una certa rappresentazione binaria eb abbia una certa rappresentazione binaria.
Quindi, se a è uguale a, di nuovo, 60
eb è uguale a 13, il risultato della somma dei due
bit per bit sarà 0000 11 00, che è 12.
Ancora una volta, esaminerò questi esempi ma questo sta cercando di fornire
una piccola descrizione di questi diversi operatori binari.
Il simbolo minore di minore di sposterà i bit a sinistra.
Quindi il valore dell'operando sinistro viene spostato a sinistra del numero di bit specificato dall'operando bianco.
Quindi, se fai qualcosa come a minore
di minore di
2 e a è effettivamente uguale a sapere
un numero binario, ad esempio 0 0 1 1 1 1 0 0, sposterai
i byte di 2.
Quindi toglierai gli 0 e diventeranno 1 1 1 1, e quegli 0 andranno alla fine.
E lo stesso con l'operatore di turno di destra. Li stai solo spostando a destra anziché a sinistra.
Qui usi i simboli "maggiore di".
E quindi li esaminerò in un secondo.
L'altra cosa importante da capire con gli operatori bit per bit è
come valutare questi valori a e b. Quindi cosa fa un
1 e un 1 a 1, se è
una e commerciale. Se è un o
1 e 1 vale anche 1.
Ma un 1 e 1 e uno 0 se stai usando una e
commerciale facendo un e, questo restituisce 0 falso. Quindi volevo solo fornire una piccola
tabella di verità qui che mostra i valori quando
lo fai, usi un e un o un o esclusivo.
Quindi qui se hai p0 e q0, il che significa che sono
entrambi falsi e applichi un e,
sarà falso perché entrambi devono essere veri affinché sia vero.
Ed è quello che vedi nella riga 3.
Sono entrambi veri, quindi p e q valuterà 1, vero.
Se non sono entrambi veri, è sempre falso.
P o q solo 1 di loro deve essere vero.
Ecco perché vedi le righe 1 e 2 uguali a 1 e la riga 3 uguale a 1.
L'unica volta che è falso è quando sono entrambi falsi.
E poi l'esclusiva o è almeno 1 di loro è
vera e solo 1.
Quindi se p è falso e q è vero, restituirà vero.
E se p è vero e q è falso, restituirà 1.
Quindi questo ti dà un'idea di come viene valutato.
Di nuovo, molte cose di matematica, ma quando parliamo di cifre binarie, è di questo che stiamo parlando.
Quindi diamo un'occhiata ad alcuni esempi concreti e blocchi di codice. Si spera che questo possa aiutare un po '.
Quindi ecco la nostra funzione. Creerò un altro paio di variabili.
Mi assicurerò che non siano firmati anche se
è per impostazione predefinita. Quindi, se dico unsigned int a
e lo assegno a 60, in realtà verrà rappresentato in binario come 0
0 1 1 e quindi 11 00.
Se creo un'altra variabile senza segno e dico int
b e gli assegno il valore
di 13, verrà effettivamente rappresentato come in binario 0 0
00 1 1 0 1. Puoi fare le conversioni lì.
Ma quello che voglio dimostrare qui è che quando imposti questi numeri
binari, puoi disattivare i bit usando i diversi operandi bit per bit.
Quindi ora creerò solo un risultato int e dirò che
sarà uguale a 0.
E manterrà il risultato dell'operazione bit per bit.
operazione. Ora se dico che c è
uguale a e applico l'operando bit a bit e aeb, ora quello che
dovrebbe fare è se a è uguale a 1 eb è uguale a
1, quei bit verranno attivati. Quindi cosa ti aspetteresti dal risultato di questo v.
Bene, guardi il primo bit di a e guardi il primo bit di
be sono entrambi 0.
Quindi il risultato sarà 0
perché se lo fai vero in aeb, devono essere entrambi veri per essere 1.
Quindi anche il prossimo sarà 0. Il prossimo è 1 e 0, il terzo bit.
Quindi è ancora 0, 1 e 0 è ancora 0. E poi ora abbiamo un 1 e un 1.
Quindi ora finalmente abbiamo un vero. Abbiamo un altro 1 e 1. Abbiamo un vero.
E poi 0 e 0 saranno 0 e poi 0 e
1 saranno 0.
Quindi il risultato se dovessi provare a stampare c, stamperà il
valore in formato decimale. Se dovessi fare qualcosa
del genere, stamperà l'equivalente decimale di quel numero binario, che
sarebbe l'equivalente di 0 0 0 0.
E tutto questo converte binario in decimale, quindi devi capire come
farlo per capire questo esempio. Ma 0 0 0 0 1
1 0 0 è effettivamente 1 3 7, il valore
è effettivamente 12, 1 3 6 12.
Quindi questo ne stamperebbe
dodici se stampassi
c o il risultato sarebbe migliore.
Quindi se eseguo questo, vedrai che il valore è 12.
In realtà ha spento e acceso tutti i bit in base al confronto e commerciale.
Quindi ora dico
run, vediamo che il valore è in d12 perché si
sta spegnendo e sui bit e verrà
effettivamente rappresentato come 0 0 0 1 1 0
0 che è il valore 12 perché stiamo stampando un decimale .
Se dovessi cambiarlo e ora voglio fare
un o e sto ancora facendo il o e il o
ricordo è
la barra parallela proprio accanto all'invio, ora accenderò i bit solo
se 1 è vero. Quindi 00, entrambi
sono falsi. Di nuovo, sto confrontando qui.
Sto confrontando questi bit per 16 e 13.
16 è rappresentato come binario 0 0 1 1 1 1 0 0.
13 è rappresentato in binario 0 0 0 0 1 1 0 è 1.
Ognuno di quei numeri rappresenta un po '.
Quindi il primo bit in 60 è 0, il primo bit in 13 è 0.
E se li ordino insieme, 0 e 0, ottengo comunque 0. Quindi questo è il primo risultato del primo bit.
Di nuovo il secondo bit 00. Il terzo bit è 1 per 60
ed è 0 per 13.
Ora tutto ciò significa che devo avere 1 vero, quindi sarà 1.
Lo stesso vale per i bit numero 4 e 16, 13. Quindi ora ho di nuovo un 1.
E poi un 1 e 1, sono entrambi veri. Quindi di nuovo 1, tutto ciò di
cui ho bisogno è 1 vero, un altro 1.
Entrambi falsi, quindi non sarà vero. 0, ricorda che non è
vero, 1 è vero e 0 11. Quindi ora ho 0 0 1 1 1 1 0 1.
E il valore di quello in decimale se dovessi stamparlo
è ancora una volta che devi capire come
convertire binario in decimale ma fondamentalmente va 1 3
7 15 30 61. Quindi questo sta per stampare 61.
Termina questo programma e
ricostruiscilo, vedremo un valore di 61.
Quindi sono operatori bit per bit. E ancora, è un
tipo più avanzato di programmi, ma è un bel
modo per rappresentare molti dati usando la e commerciale e così via,
attivando e disattivando i bit, essenzialmente. Quindi potresti giocare
con questo. Potresti fare l'esclusiva o quale è la carota.
La carota è sopra il 6, numero 6 sulla tastiera.
Vedresti un risultato diverso. Se aggiungessi la tilde, in pratica spegnerai tutto.
Quindi per a e a è uguale a 60, 0 0 1 1 1 1 0
0, non sarà uguale a 1 1 0 0 0 0 1 1.
Un'altra cosa davvero interessante che puoi fare con gli operatori binari è lo
spostamento, lo spostamento a sinistra ea destra. Ci sono un paio di cose fondamentali che sai
quando devi spostare a sinistra oa destra.
Prima di tutto, sappiamo che un int senza segno significa che
può essere solo positivo. Non può essere negativo.
Quindi se stai memorizzando un valore negativo lì dentro, la compilazione lo convertirà sarà più lungo, occuperà molte dimensioni.
Quindi ricorda che gli int senza segno significano che puoi avere solo valori positivi.
I numeri interi con segno indicano che possono essere negativi o positivi.
Ma se vuoi cambiare, ricorda
per spostarti a sinistra, quindi ora se diciamo che il risultato
è uguale e diciamo che vogliamo spostare un, diciamo, di 2, l'altra
cosa importante che
vuoi sapere è quando hai gli interi, gli interi
sono, ricorda, sono 4 byte sulla maggior
parte delle piattaforme. Dipende che puoi ottenere
la dimensione facendo la dimensione dell'operatore. Quindi il numero intero è
davvero 4 è 32 bit, quindi in realtà il
numero è qualcosa del genere. Il 16 qualcosa
del genere che cos'è 4 8 12 16 20 24.
Quindi probabilmente hai qualcosa del genere e qualcosa del genere.
Questo è davvero il numero. Ho mostrato solo gli ultimi
8 bit perché gli altri erano 0. Ma se lo guardi come un numero
intero a 32 bit, che è 4 byte, questo è come appare
in binario, 4 0s 4 0s 4 0s 4 0s 4 0s 4 0s
e poi 0 0 1 1 1 1 0 0 .
Quindi devi conoscere la dimensione quando esegui lo spostamento a
sinistra oa destra perché se sposti più di 2, non sarà chiaro.
Non scende o niente del genere.
Quindi, di nuovo, lasciami assicurarmi che 48 12 16 20 24
28 32 e lo stesso varrebbe per 13.
Quindi, se dovessi spostare a sinistra un maggiore di
maggiore di 2, ciò che finirai per avere è che anche
questi 1 si sposteranno a sinistra. Quindi il risultato sarà
ancora tutti quegli 0 precedenti, ma
poi avrai 1 1 1 1 0 0 0 0.
E questo sarà uguale a 240.
E se faccio una conversione veloce, lo faccio nella mia testa
dicendo 1 3 7 15 30 60 122 40,
ma possiamo confermarlo costruendo e correndo e vedrai che
il risultato è 240.
E vediamo che il risultato è 240.
Quindi ora se vuoi passare effettivamente al mio più di 2 s dì che
vuoi spostare di 4, questo è il momento in cui diventa importante capire che è un numero a 32 bit.
Quindi qui dovresti effettivamente usare alcuni di quegli 0.
Quindi, se vuoi spostare di 4 in realtà, quello che avresti è che
avresti qualcosa del genere.
E poi se vuoi raggrupparli
per 4, avresti qualcosa
del genere. Quindi il risultato
qui sarebbe di nuovo se lo facessi nella
mia testa, hai 1 3 7 15
30 60120140480 e poi 960.
Si spera di averlo fatto bene. Di nuovo quando eseguiamo questo e
diciamo 960, quindi si
sposta a sinistra. Se vuoi
spostarti a destra, usa i simboli maggiore di.
Quindi spostando l'operatore binario di spostamento a destra di destra,
si esegue il maggiore di. Operatore binario di spostamento a sinistra, fai il meno di.
Quindi qui se hai intenzione di spostarti a destra, vuoi spostarti a destra 4.
E cosa succede se hai la fine qui, quindi se hai i tuoi
60 originali, provi a fare 4. Avrai cifre che verranno semplicemente lasciate.
Quindi invece di avere questi ultimi 4 che in origine
ne abbiamo di nuovo 60. Quindi abbiamo 0
0 0 1 1 1 1 0 0, dobbiamo spostarci su 4.
Quindi finiremo per perdere 2 bit perché cadranno.
E ciò con cui
finiremo è qualcosa come questo
0 0. E quindi questo sarebbe solo uguale a
3, qualcosa del genere quindi in realtà perdi bit perché ti stai spostando troppo a
destra, hai il risultato di 3. Quindi devi stare attento quando
sposti a sinistra ea destra, assicurati di usare di nuovo quei 32
bit 4 byte a seconda del tuo sistema.
È un breve riepilogo degli operatori bit per bit.
Quando diventi più avanzato, devi capire come puoi
effettivamente verificare se un particolare bit è 1 o 0.
È piuttosto semplice. Devi solo fare un e su di esso.
Ma devi scrivere un po 'più di codice.
Questa lezione non intendeva essere uno sguardo esaustivo agli operatori bit per bit.
Volevo darti una
panoramica, darti un buon vantaggio. Ma per capire di più questi
operatori, dovrai studiare un po 'di più, usarli e metterli in pratica.
Quindi spero che questo sia stato utile. Ancora una volta, può creare un po 'di
confusione, quindi vuoi seguire e vuoi giocare con esso. Ma ancora una volta, qual è il modo migliore per
imparare, scrivere del codice, imparare alcuni esempi. Grazie.