Pages: [1]   Go Down
Author Topic: Bitshifting  (Read 397 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per la risposta, prima di tutto smiley

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:
byte primo = B11010100;

//come ottengo 0(l'msb)

Grazie mille ancora per la risposta!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
if (variabile & 0b10000000)
questo test sarà vero solo se l'ottavo bit è pari a 1
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley

2) con una operazione di AND per bit:
Code:
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!
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5945
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ... smiley-wink

Guglielmo
Logged

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-neutral
« Last Edit: November 12, 2013, 05:02:21 pm by aleale97 » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5945
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Guglielmo
Logged

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

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5945
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricorda i vari operatori logici ...


Guglielmo
Logged

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5945
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Inutile dare le soluzioni che non si capiscono, molto meglio far arrivare alla soluzione, grazie mille ancora smiley-wink

Esatto ... e come vedi ... ci sei facilmente arrivato smiley-wink

Guglielmo
Logged

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

Pages: [1]   Go Up
Jump to: