Go Down

Topic: Bitshifting (Read 461 times) previous topic - next topic

aleale97

Ciao a tutti, qualcuno mi può spiegare bitshifting?
Volevo fare una mia "libreria" personale per gli shiftregisters e ho quindi bisogno di ricavare l'MSB da un BYTE. In tutte le pagine che ho trovato su google, si parla di bitshifting ma in ogni caso(neanche qui http://arduino.cc/en/Reference/Bitshift) non ho capito a cosa mi possa servire...

Grazie mille, Alessandro :D

leo72

Il bit shifting, come dice il nome, è lo spostamento dei bit.

L'MSB è il Most Significant Bit, ossia il bit più significativo. Sui micro Atmel è quello più a sinistra.

aleale97

Grazie per la risposta, prima di tutto :)

Il fatto è che questo lo avevo capito, l'ho fatto anche a scuola questo argomento. Il problema è, in modo pratico, come faccio da un byte a trovare l'MSB?

Code: [Select]

byte primo = B11010100;

//come ottengo 0(l'msb)


Grazie mille ancora per la risposta!

leo72

Come ti ho detto, il bit più significativo è quello a sinsitra.
Per "leggerlo" hai 2 modi:
1) col link che avevi postato tu, arrivi a bitRead: leggi il bit di un byte. Esempio:
Code: [Select]
if (bitRead(variabile, 7) == 1)
Questo if è valido se il bit in posizione 7, quindi l'ottavo bit (attenzione alle numerazioni, partono da 0), è uguale a 1.

2) con una operazione di AND per bit:
Code: [Select]
if (variabile & 0b10000000)
questo test sarà vero solo se l'ottavo bit è pari a 1

aleale97

Grazie mille per la risposta!

Come ti ho detto, il bit più significativo è quello a sinsitra.
Per "leggerlo" hai 2 modi:
1) col link che avevi postato tu, arrivi a bitRead: leggi il bit di un byte. Esempio:
Code: [Select]
if (bitRead(variabile, 7) == 1)
Questo if è valido se il bit in posizione 7, quindi l'ottavo bit (attenzione alle numerazioni, partono da 0), è uguale a 1.

Perfetto, già questo basta per la mia applicazione :)


2) con una operazione di AND per bit:
Code: [Select]
if (variabile & 0b10000000)
questo test sarà vero solo se l'ottavo bit è pari a 1

Questo invece non l'ho capito, mi sapresti spiegare perche facendo la AND con quel byte dovrebbe darmi true la condizione?

Grazie grazie grazie!

gpb01


Questo invece non l'ho capito, mi sapresti spiegare perche facendo la AND con quel byte dovrebbe darmi true la condizione?


Prova a pensare a come funziona l'operatore booleano AND ed applicalo a ciò che è tra parentesi ... ricordando che un risultato uguale 0 è FALSE mentre un risultato diverso da 0 è TRUE ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

aleale97

#6
Nov 12, 2013, 10:59 pm Last Edit: Nov 12, 2013, 11:02 pm by aleale97 Reason: 1
Dunque, correggetemi se sbaglio:




Prendo 8bit di esempio    11011010
Li sommo con    10000000
Ottengo come risultato    00111010

che è diverso da 0, quindi mi restituisce true nonostante il primo bit(a partire da sinistra?-msb) sia 1. Dove sbaglio  :|

gpb01

No, No, No ... l'operatore AND logico, booleano, non la somma, ... si applica bit a bit :



quindi, prendi il tuo esempio 1 1 0 1  1 0 1 0  e, BIT A BIT, fanne l'AND con 1 0 0 0  0 0 0 0 ... e vedi quanto viene ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Ricorda i vari operatori logici ...



Guglielmo
Search is Your friend ... or I am Your enemy !

aleale97

Grazie mille! Io facevo and su tutto il byte e quindi facevo in sostanza la somma booleana. Inutile dare le soluzioni che non si capiscono, molto meglio far arrivare alla soluzione, grazie mille ancora ;)

gpb01


Inutile dare le soluzioni che non si capiscono, molto meglio far arrivare alla soluzione, grazie mille ancora ;)


Esatto ... e come vedi ... ci sei facilmente arrivato ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up