Comprensione dell’operatore AND bit a bit

Ho letto degli operatori di bit in Objective-C nel libro di Kochan, “Programming in Objective-C”.

Sono MOLTO confuso riguardo a questa parte, anche se ho davvero capito la maggior parte di tutto ciò che mi è stato presentato finora.

Ecco una citazione dal libro:

L’operatore bitwise AND

L’ANDing bit a bit viene spesso utilizzato per le operazioni di mascheramento. Cioè, questo operatore può essere usato facilmente per impostare bit specifici di un elemento di dati su 0. Ad esempio, la dichiarazione

w3 = w1 & 3; 

assegna a w3 il valore di w1 AND bit a bit con la costante 3. Ha lo stesso effetto di impostare tutti i bit in w, diversi dai due bit più a destra su 0 e preservando i due bit più a destra da w1.

Come con tutti gli operatori aritmetici binari in C, gli operatori di bit binari possono anche essere utilizzati come operatori di assegnazione aggiungendo un segno di uguale. La dichiarazione

 word &= 15; 

pertanto svolge la stessa funzione del seguente:

 word = word & 15; 

Inoltre, ha l’effetto di impostare tutti tranne i quattro bit della parola più a destra su 0. Quando si usano le costanti nell’esecuzione di operazioni bit a bit, di solito è più conveniente esprimere le costanti in notazione ottale o esadecimale.

OK, questo è quello che sto cercando di capire. Ora, sono estremamente confuso con quasi tutto questo concetto e sto solo cercando un piccolo chiarimento se qualcuno è disposto ad aiutarmi.

Quando il libro fa riferimento a “impostazione di tutti i bit” ora, tutti i bit .. Che cosa è esattamente un po ‘. Non è solo uno 0 o 1 nella seconda base, in altre parole, binario?

In tal caso, perché, nel primo esempio, ci sono tutti i bit tranne il “2º più a destra” a 0? È 2 perché è 3 – 1, prendendo 3 dalla nostra costante?

Grazie!

I numeri possono essere espressi in binario come questo:

 3 = 000011 5 = 000101 10 = 001010 

…eccetera. Presumo che tu abbia familiarità con il binario.

Bitwise AND significa prendere due numeri, allinearli uno sopra l’altro e creare un nuovo numero che abbia un 1 in cui entrambi i numeri hanno un 1 (tutto il resto è 0).

Per esempio:

  3 => 00011 & 5 => 00101 ------ ------- 1 00001 

OR bit a bit significa prendere due numeri, allinearli uno sopra l’altro e creare un nuovo numero con un 1 in cui entrambi i numeri hanno un 1 (tutto il resto è 0).

Per esempio:

  3 => 00011 | 5 => 00101 ------ ------- 7 00111 

Bitmap XOR (OR esclusivo) significa prendere due numeri, allinearli uno sopra l’altro e creare un nuovo numero che abbia un 1 in cui entrambi i numeri hanno un 1 E l’altro numero ha uno 0 (tutto il resto è 0).

Per esempio:

  3 => 00011 ^ 5 => 00101 ------ ------- 6 00110 

Bit NOR (non OR) significa prendere l’OR bit a bit di due numeri e quindi invertire tutto (dove c’era uno 0, ora c’è un 1, dove c’era un 1, ora c’è uno 0).

NAND bit a bit (non AND) significa prendere AND bit a bit di due numeri e quindi invertire tutto (dove c’era uno 0, ora c’è un 1, dove c’era un 1, ora c’è uno 0).

Continuo: perché la word &= 15 imposta tutti tranne i 4 bit più a destra su 0? Dovresti essere in grado di capirlo adesso …

  n => abcdefghjikl & 15 => 000000001111 ------ -------------- ? 00000000jikl 

( 0 AND a = 0 , 0 AND b = 0 , … j AND 1 = j , i AND 1 = i , …)

Come è utile? In molte lingue, usiamo le cose chiamate “maschere di bit”. Una maschera di bit è essenzialmente un numero che rappresenta un insieme di numeri più piccoli combinati insieme. Possiamo combinare i numeri usando OR, e separarli usando AND. Per esempio:

 int MagicMap = 1; int MagicWand = 2; int MagicHat = 4; 

Se ho solo la mappa e il cappello, posso esprimerlo come myInventoryBitmask = (MagicMap | MagicHat) e il risultato è la mia maschera di bit. Se non ho niente, la mia maschera di bit è 0. Se voglio vedere se ho la mia bacchetta, allora posso fare:

 int hasWand = (myInventoryBitmask & MagicWand); if (hasWand > 0) { printf("I have a wand\n"); } else { printf("I don't have a wand\n"); } 

Prendilo?

EDIT: più cose

Troverai anche l’operatore “bitshift”: << e >>. Significa solo “spostare tutto a sinistra n bit” o “spostare tutto a destra n bit”.

In altre parole:

1 << 3 = 0001 << 3 = 0001000 = 8

E:

8 >> 2 = 01000 >> 2 = 010 = 2

“Bit” è l’abbreviazione di “cifra binaria”. E sì, è uno 0 o 1. Ci sono quasi sempre 8 in un byte, e sono scritti in un certo senso come i numeri decimali sono – con la cifra più significativa a sinistra e la meno significativa a destra.

Nel tuo esempio, w1 & 3 maschera tutto tranne le due cifre meno significative (più a destra) perché 3, in binario, è 00000011. (2 + 1) L’operazione AND restituisce 0 se entrambi i bit essendo ANDed è 0, quindi tutto tranne l’ultimo due bit sono automaticamente 0.

 w1 = ????...??ab 3 = 0000...0011 -------------------- & = 0000...00ab 

0 e qualsiasi bit N = 0

1 e qualsiasi bit N = N

Quindi, qualsiasi cosa con 3 bit bit ha tutti i loro bit tranne gli ultimi due impostati su 0. Gli ultimi due bit, aeb in questo caso, vengono conservati.

@cHao e tutti: no! I bit non sono numeri. Non sono zero o uno!

Bene, 0 e 1 sono interpretazioni possibili e valide. Zero e uno è l’interpretazione tipica.

Ma un po ‘è solo una cosa, rappresentando una semplice alternativa. Dice “è” o “non è”. Non dice nulla riguardo alla cosa, al “esso”, a se stessa. Non dice, che cosa è.

Nella maggior parte dei casi questo non ti disturberà. Puoi prenderli per i numeri (o parti, cifre, numeri) mentre tu (o la combinazione di linguaggi di programmazione, CPU e altro hardware, che conosci come “tipico”) fai usalmente – e forse non avrai mai problemi con loro.

Ma non vi è alcun problema principale se si cambia il significato di “0” e “1”. Ok, se facessi questo mentre programmassi l’assemblatore, lo troverai un po ‘problematico dato che alcuni mnemonici faranno altra logica, poi ti diranno con i loro nomi, i numeri saranno negati e cose del genere.

Dai un’occhiata a http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm se vuoi.

Saluti