Finestre.  Virus.  I Quaderni.  Internet.  ufficio.  Utilità.  Autisti

In questo articolo, ti illustrerò come funzionano le operazioni sui bit. A prima vista possono sembrarti qualcosa di complicato e inutile, ma in realtà non è affatto così. Questo è quello che cercherò di convincerti.

introduzione

Gli operatori bit per bit operano direttamente sui bit di un numero, quindi i numeri negli esempi saranno in binario.

Tratterò i seguenti operatori bit a bit:

  • | (OR bit a bit (OR)),
  • & (AND bit per bit (AND)),
  • ^ (OR esclusivo (XOR)),
  • ~ (negazione bit per bit (NOT)),
  • << (Побитовый сдвиг влево),
  • >> (spostamento bit a destra).

Le operazioni sui bit sono studiate in matematica discreta e sono anche alla base della tecnologia digitale, poiché si basano sulla logica del funzionamento delle porte logiche: gli elementi di base circuiti digitali. Nella matematica discreta, come nella tecnologia digitale, le tabelle di verità sono usate per descrivere il loro funzionamento. Le tabelle di verità, mi sembra, facilitino notevolmente la comprensione delle operazioni bit a bit, quindi le fornirò in questo articolo. Tuttavia, non vengono quasi mai utilizzati nelle spiegazioni degli operatori bit a bit nei linguaggi di programmazione di alto livello.

Devi anche conoscere gli operatori bit a bit:

  1. Alcuni operatori bit per bit sono simili agli operatori che probabilmente conosci (&&, ||). Questo perché in realtà sono in qualche modo simili. Tuttavia, non dovrebbero mai essere confusi.
  2. La maggior parte delle operazioni bit per bit sono operazioni di assegnazione composte.

OR bit a bit (OR)

L'OR bit per bit è equivalente all'OR logico, ma applicato a ciascuna coppia di bit di un numero binario. La cifra binaria del risultato è 0 solo quando entrambi i bit corrispondenti in B sono 0. In tutti gli altri casi, il risultato binario è 1. Cioè, se abbiamo la seguente tabella di verità:

38 | 53 sarà così:

UN 0 0 1 0 0 1 1 0
B 0 0 1 1 0 1 0 1
UN | B 0 0 1 1 0 1 1 1

Di conseguenza, otteniamo 110111 2 o 55 10 .

AND bit per bit (AND)

L'AND bit per bit è un po' l'opposto dell'OR bit per bit. La cifra binaria del risultato è 1 solo quando entrambi i bit corrispondenti degli operandi sono 1. In altre parole, possiamo dire che le cifre binarie del numero risultante sono il risultato della moltiplicazione dei bit corrispondenti dell'operando: 1x1 \u003d 1 , 1x0 \u003d 0. La seguente tabella di verità corrisponde all'AND bit a bit:

Un esempio dell'operazione di AND bit per bit sull'espressione 38 e 53:

UN 0 0 1 0 0 1 1 0
B 0 0 1 1 0 1 0 1
A&B 0 0 1 0 0 1 0 0

Di conseguenza, otteniamo 100100 2 o 36 10 .

Utilizzando l'operatore AND bit a bit, è possibile verificare se un numero è pari o dispari. Per i numeri interi, se il bit meno significativo è 1, il numero è dispari (basato sulla conversione da binario a decimale). Perché è necessario quando puoi semplicemente usare %2 ? Sul mio computer, ad esempio, &1 è più veloce del 66%. Abbastanza buono aumento delle prestazioni, ti dico.

OR esclusivo (XOR)

La differenza tra XOR e OR bit per bit è che per ottenere un 1, solo un bit nella coppia può essere 1:

Ad esempio, l'espressione 138^43 sarebbe...

UN 1 0 0 0 1 0 1 0
B 0 0 1 0 1 0 1 1
A^B 1 0 1 0 0 0 0 1

… 10100001 2 o 160 10

Con ^ puoi modificare i valori di due variabili (aventi lo stesso tipo di dati) senza utilizzare una variabile temporanea.

Puoi anche crittografare il testo usando XOR. Per fare ciò, devi solo scorrere tutti i caratteri e ^ con il carattere chiave. Per una cifratura più complessa, puoi utilizzare una stringa di caratteri:

String msg = "Questo è un messaggio"; char messaggio = msg.toCharArray(); Chiave di stringa = ".*)"; StringaStringa crittografata = new String(); for(int i = 0; i< message.length; i++){ encryptedString += message[i]^key.toCharArray(); }

XOR non il massimo modo affidabile crittografia, ma può essere inserito nell'algoritmo di crittografia.

Negazione bit a bit (NOT)

La negazione bit per bit inverte tutti i bit dell'operando. Cioè, quello che era 1 diventerà 0 e viceversa.

Ecco, ad esempio, l'operazione ~52:

UN 0 0 1 1 0 1 0 0
~A 1 1 0 0 1 0 1 1

Il risultato sarà 203 10

Quando si utilizza la negazione bit per bit, il segno del risultato sarà sempre opposto al segno del numero originale (quando si lavora con numeri con segno). Perché questo sta accadendo, lo scoprirai proprio ora.

Codice aggiuntivo

Qui dovrei parlarvi un po' del modo in cui i numeri interi negativi sono rappresentati nei computer, vale a dire il complemento a due. Senza entrare nei dettagli, serve per facilitare l'aritmetica dei numeri binari.

La cosa principale che devi sapere sui numeri in complemento a due è che il bit più significativo è firmato. Se è uguale a 0, allora il numero è positivo e coincide con la rappresentazione di questo numero nel codice diretto, e se 1, allora è negativo. Cioè, 10111101 è negativo e 01000011 è positivo.

Per convertire un numero negativo in complemento a due, è necessario invertire tutti i bit del numero (ovvero, utilizzare la negazione bit a bit) e aggiungere 1 al risultato.

Ad esempio, se abbiamo 109:

UN 0 1 1 0 1 1 0 1
~A 1 0 0 1 0 0 1 0
~LA+1 1 0 0 1 0 0 1 1

Con il metodo sopra, otteniamo -109 in complemento a due.
È stata appena presentata una spiegazione molto semplificata del codice aggiuntivo e ti consiglio vivamente di studiare questo argomento in modo più dettagliato.

Spostamento di bit a sinistra

Gli spostamenti bit per bit sono leggermente diversi dalle operazioni bit per bit discusse in precedenza. Uno spostamento a sinistra bit per bit sposta i bit del suo operando N bit a sinistra, a partire dal bit meno significativo. Gli spazi vuoti dopo lo spostamento sono riempiti con zeri. Succede così:

UN 1 0 1 1 0 1 0 0
UN<<2 1 1 0 1 0 0 0 0

Una caratteristica interessante dello spostamento a sinistra di N posizioni è che equivale a moltiplicare un numero per 2 N . Quindi 43<<4 == 43*Math.pow(2,4) . Использование сдвига влево вместо Math.pow обеспечит неплохой прирост производительности.

Un po' spostato a destra

Come avrai intuito, >> sposta verso destra i bit dell'operando del numero di bit indicato.

Se l'operando è positivo, gli spazi vuoti vengono riempiti con zeri. Se inizialmente lavoriamo con un numero negativo, tutti gli spazi vuoti a sinistra vengono riempiti con unità. Questo viene fatto per preservare il segno secondo il codice aggiuntivo spiegato in precedenza.

Poiché uno spostamento a destra bit a bit è l'opposto di uno spostamento a sinistra bit a bit, è facile indovinare che lo spostamento di un numero a destra di N numero di posizioni divide anche quel numero per 2 N . Ancora una volta, questo è molto più veloce della normale divisione.

Conclusione

Quindi, ora sai di più sulle operazioni sui bit e non averne paura. La mia ipotesi è che non userai >>1 ogni volta che dividi per 2. Tuttavia, le operazioni bit a bit sono piacevoli da avere nel tuo arsenale e ora puoi usarle se necessario o rispondere a una domanda di intervista complicata.


Operatore Sintassi Descrizione
E A E B Congiunzione: Se A e B hanno vero valore, quindi - Vero. Altrimenti - Falso
O A o B Disgiunzione: Se uno degli operandi è True, allora True. Altrimenti - Falso
NON NON A Negazione: Se A è Falso, allora Vero. Altrimenti - Falso
XOR A XOR B Eccezione: Se A è Vero o B è Vero, allora Vero. Altrimenti - Falso
EQV A EQV B Equivalenza: Se A ha lo stesso valore di B, allora True. Altrimenti - Falso
IMP UN IMP B Coinvolgimento: Se A è Vero e B è Falso, allora Falso. Altrimenti - Vero

Come operando per un operatore logico, puoi utilizzare qualsiasi espressione valida che abbia un risultato booleano, nonché un numero che può essere convertito in un valore booleano.

Il risultato di un'operazione logica è un valore di tipo Boolean (o Null se almeno uno degli operandi è Null).

Operatore logico AND

Sintassi:
Operando_1 AND Operando_2


L'operatore AND esegue congiunzione logica.

Il risultato di questa operazione è True solo quando entrambi gli operandi sono True, altrimenti False.


tavola della verità


L'operatore AND può essere utilizzato su più operandi:


(5 3) AND (5=6) risultato è Falso


Indipendentemente dal numero di operandi, l'operazione AND logica restituirà True solo se tutti gli operandi dell'espressione restituiscono True. In ogni altro caso, il risultato sarà Falso. Si noti che gli operandi sono racchiusi tra parentesi. VBA valuta prima il valore di ciascun operando all'interno delle parentesi, quindi l'intera espressione.

Operatore logico OR

Sintassi:
Operando_1 O Operando_2


L'operatore OR esegue disgiunzione logica.

Il risultato di questa operazione è True se almeno uno degli operandi è True, altrimenti False.


tavola della verità


L'operatore OR può essere utilizzato su più operandi:


(5 3) OR (5=6) risultato è Vero


Indipendentemente dal numero di operandi, il risultato dell'operazione OR logica sarà sempre True se almeno uno degli operandi dell'espressione restituisce True. In caso contrario, il risultato sarà Falso.

Gli operatori AND e OR possono essere combinati:


((5 3)) OR (5=6) risultato è Vero

Operatore booleano NOT

Sintassi:
NON operando


L'operatore NOT lo fa negazione logica.

L'operatore NOT utilizza un solo operando.


tavola della verità


Gli operatori AND OR NOT possono essere combinati:


((5 3)) OR NOT (5=6) risultato è vero

Operatore logico XOR

Sintassi:
Operando_1 XOR Operando_2


L'operatore XOR esegue eccezione logica.

Il risultato di questa operazione è True se gli operandi hanno valori diversi, altrimenti False.


tavola della verità


((5 3)) OR NOT (5=6) XOR (5=5) risultato è Falso

Operatore logico EQV

Sintassi:
Operando_1 EQV Operando_2


L'operatore EQV è l'operatore equivalenza logica.

Il risultato di questa operazione è True se gli operandi hanno lo stesso valore, altrimenti False.


tavola della verità


Il risultato ((5 3)) OR NOT (5=6) EQV (5=5) è Vero

Operatore booleano IMP

Sintassi:
Operando_1 IMP Operando_2


L'istruzione IMP esegue un'operazione logica implicazioni.


tavola della verità


((5 3)) OR NOT (5=6) IMP (5=5) risultato è Vero


L'operatore logico IMP è il meno intuitivo di tutti operatori logici. Fortunatamente, la necessità del suo utilizzo si presenta abbastanza raramente.

Denotato dalla figura retorica "o ... o ..." L'affermazione composta "o A o B" è considerata vera quando A o B sono vere, ma non entrambe contemporaneamente; altrimenti l'affermazione composta è falsa.

Quelli. il risultato è vero (uguale a 1), Se A non è uguale a B (A≠B).

Questa operazione è spesso paragonata alla disgiunzione perché sono molto simili nelle proprietà, ed entrambe sono simili all'unione "o" nel linguaggio quotidiano. Confronta le regole per queste operazioni:

1. vero se vero O , O entrambi in una volta.

2. vero se vero O, Ma Non entrambi in una volta.

Operazione esclude l'ultima opzione ("entrambi contemporaneamente") e per questo si chiama "OR" esclusivo. Ambiguità linguaggio naturale è che l'unione "o" può essere usata in entrambi i casi.

5. Implicazione (conseguenza logica)è formato combinando due affermazioni in una usando la figura retorica "se ..., allora ....".

Ingresso: A®B

Un enunciato composto formato dall'operazione di implicazione è falso se e solo se una conclusione falsa segue da una premessa vera (il primo enunciato) (il secondo enunciato).

Quelli. se 1 implica 0, allora il risultato è 0, altrimenti è 1.

Ad esempio, l'affermazione "Se un numero è divisibile per 10, allora è divisibile per 5" è vera, perché sia la prima che la seconda affermazione sono vere.

L'affermazione "Se un numero è divisibile per 10, allora è divisibile per 3" è falsa, perché da una premessa vera si trae una conclusione falsa.

"Questo quadrilatero è un quadrato" (UN) E "Un cerchio può essere circoscritto attorno a un dato quadrilatero" (IN). Quindi l'istruzione composta si legge come "Se il quadrilatero dato è un quadrato, allora si può circoscrivere un cerchio attorno ad esso."

Nel discorso ordinario, il link "se poi" descrive una relazione causale tra affermazioni. Ma nelle operazioni logiche, il significato delle affermazioni non viene preso in considerazione. Viene considerata solo la loro verità o falsità. Pertanto, non bisogna essere imbarazzati dalla "mancanza di significato" delle implicazioni formate da affermazioni completamente estranee nel contenuto. Ad esempio, in questo modo: "Se il presidente degli Stati Uniti è un democratico, allora ci sono giraffe in Africa", "Se un'anguria è una bacca, allora c'è benzina nella stazione di servizio".

6. L'equivalenza (uguaglianza logica, ~ º Û) si forma combinando due affermazioni in una usando la figura retorica "...se e solo se..."

Un'affermazione composta formata dall'operazione di equivalenza è vera se e solo se entrambe le affermazioni sono false o vere allo stesso tempo.

Ad esempio, le affermazioni "Un computer può eseguire calcoli se e solo se è acceso" e "Un computer non può eseguire calcoli se e solo se non è acceso" sono vere, poiché entrambe le affermazioni semplici sono contemporaneamente vere.


tavole di verità

Per ogni enunciato composto (funzione logica) è possibile costruire una tavola di verità che ne determini la verità o la falsità per tutte le possibili combinazioni dei valori iniziali di enunciati semplici.

tavola della veritàè una rappresentazione tabellare di un circuito logico (operazione) che elenca tutte le possibili combinazioni di valori di verità segnali di ingresso(operandi) insieme al valore di verità del segnale di uscita (il risultato dell'operazione) per ciascuna di queste combinazioni.

Riflettiamo le operazioni logiche di cui sopra nella tabella di verità:

Nell'algebra delle proposizioni, tutte le funzioni logiche possono essere ridotte mediante trasformazioni logiche a tre fondamentali: addizione logica, moltiplicazione logica e negazione logica.

Dimostriamo che l'implicazione dell'operazione A®B è equivalente all'espressione logica:

Spesso, per dimostrare le capacità limitate dei percettroni a strato singolo nella risoluzione dei problemi, ricorrono a considerare il cosiddetto problema XOR - OR esclusivo.

L'essenza del problema è la seguente. Viene data la funzione logica XOR - OR esclusivo. Questa è una funzione di due argomenti, ciascuno dei quali può essere zero o uno. Assume il valore quando uno degli argomenti è uguale a uno, ma non entrambi, altrimenti. Il problema può essere illustrato con un sistema a singolo strato, singolo neurone e due input mostrato nella figura seguente.

Indichiamo un input con e l'altro con , quindi tutte le loro possibili combinazioni saranno costituite da quattro punti sul piano. La tabella seguente mostra la relazione richiesta tra input e output, dove le combinazioni di input che dovrebbero produrre un output pari a zero sono etichettate e , un singolo output è etichettato e .

punti Senso Senso Uscita richiesta
0 0 0
1 0 1
0 1 1
1 1 0

Un neurone con due input può formare una superficie decisionale sotto forma di una linea retta arbitraria. Affinché la rete possa implementare la funzione XOR fornita dalla tabella sopra, è necessario posizionare la linea in modo che i punti si trovino su un lato della linea e i punti sull'altro. Cercando di tracciare una linea così retta nella figura sottostante, siamo convinti che ciò sia impossibile. Ciò significa che, indipendentemente dai valori assegnati ai pesi e alla soglia, una rete neurale a strato singolo non è in grado di riprodurre la relazione input-output necessaria per rappresentare la funzione XOR.

Tuttavia, la funzione XOR è facilmente formata da una rete a due strati e in molti modi. Consideriamo uno di questi modi. Modernizziamo la rete nella figura aggiungendo un altro strato nascosto di neuroni:

Notare che questa rete dato così com'è, cioè si può presumere che sia già addestrata. I numeri sopra le frecce mostrano i valori dei pesi sinaptici. Come funzione di attivazione, utilizziamo la funzione di salto unitario con la soglia , che ha il seguente grafico:

Quindi il risultato del funzionamento di tale rete neurale può essere rappresentato come la seguente tabella:

punti Senso Senso Uscita richiesta
0 0 0 0 0 0
1 0 1 1 0 1
0 1 1 0 1 1
1 1 0 0 0 0

Ciascuno dei due neuroni del primo strato forma una superficie di decisione sotto forma di una linea retta arbitraria (divide il piano in due semipiani), e il neurone dello strato di uscita combina queste due soluzioni, formando una superficie di decisione nel forma di una striscia formata da linee rette parallele di neuroni del primo strato:

La rete neurale utilizzata in questo articolo per risolvere il problema XOR è primitiva e non utilizza tutte le funzionalità delle reti multistrato. Ovviamente multistrato reti neurali hanno potere rappresentativo maggiore di quelli monostrato, solo nel caso di presenza di non linearità. E in questa rete viene applicata una funzione di attivazione lineare di soglia. Tale rete non può essere addestrata, ad esempio, applicando l'algoritmo di backpropagation.

In pratica, gli elementi XOR a due input vengono utilizzati più spesso. Sulla fig. 1 mostra un condizionale designazione grafica elemento senza inversione e la sua tabella di stato. In termini semplici, l'essenza di questo elemento è la seguente, il segnale di uscita appare solo quando i livelli logici agli ingressi non sono gli stessi.

Schema di selezione del fronte e taglio dell'impulso

In questo circuito vengono utilizzati tre elementi XOR per ritardare gli impulsi. DD1.4 - somma. Gli impulsi di uscita hanno fronti di salita e di discesa stabili. La durata di ciascun impulso di uscita è pari a tre volte il tempo di ritardo di commutazione di ciascuno dei tre elementi. L'intervallo di tempo tra i fronti degli impulsi di uscita è uguale alla durata dell'impulso di ingresso. Questo dispositivo raddoppia anche la frequenza del segnale di ingresso.

C'è un'altra proprietà interessante "XOR". Se una costante "0" viene applicata a uno degli ingressi, il segnale all'uscita dell'elemento ripeterà il segnale di ingresso e se la costante "0" viene modificata in una costante "1", il segnale di uscita essere già l'inversione dell'input.

A volte diventa necessario ottenere un elemento XOR da elementi logici standard separati. Un esempio è il circuito dell'elemento XOR implementato su quattro elementi 2-AND-NOT. La Figura 3 mostra il circuito XOR nei suoi quattro stati. Questo mostra tutti i possibili livelli logici su ciascuna delle porte 2-NAND utilizzate.

Tali elementi sono inclusi nello schema. In questo circuito, l'elemento XOR è realizzato su quattro elementi 2-AND-NOT inclusi in un alloggiamento del microcircuito K561LA7.

plasmatore segnale discreto con differenza di frequenza

Il circuito shaper è mostrato in Figura 4. Qui, l'elemento logico XOR è implementato anche su quattro elementi 2-AND-NOT.

Agli ingressi 1 e 2 dello shaper cadono gli impulsi rettangolari (vedi grafici 1 e 2), che differiscono per frequenza di ripetizione. Il nodo sugli elementi logici DD1.1-DDI.4 moltiplica questi segnali. Il segnale impulsivo di uscita (grafico 3) dall'elemento DD1.4 viene inviato al circuito integratore R3, C1, che lo converte in un segnale triangolare (grafico 4) con una frequenza pari alla differenza di frequenza dei segnali di ingresso, e il L'amplificatore operazionale DA1 converte il segnale ricevuto in un meandro (vedi Fig. grafico 5). Il resistore R1 regola la durata delle semionde positive e negative del segnale di uscita. Uno schema molto interessante. Radio designer, c'è qualcosa a cui pensare. Ad esempio, il segnale mostrato nel terzo grafico è un segnale sinusoidale PWM.
Naturalmente, la gamma di utilizzo degli elementi XOR è molto più ampia. Ho portato qui secondo me più interessante per i radioamatori.

Se noti un errore, seleziona una parte di testo e premi Ctrl + Invio
CONDIVIDERE: