hilpers


  hilpers > hobby.* > hobby.elettronica.digitale > 10/2008

 #1  
14.10.2008, 10:21
Spectre
Ciao a tutti,

dovrei contare tutti i bit = 1 all'interno di un byte.

Ad esempio,se il mio byte pippo è 11100000 in binario,la somma di tutti
gli 1 è 3.

Senza dover puntare ai singoli bit con un contatore so che si puo' fare
con degli shift,ma non so' come.

Grazie


Spectre
 #2  
14.10.2008, 10:40
Spectre
Spectre ha scritto:
> Ciao a tutti,
>
> dovrei contare tutti i bit = 1 all'interno di un byte.
>
> Ad esempio,se il mio byte pippo è 11100000 in binario,la somma di tutti
> gli 1 è 3.
>
> Senza dover puntare ai singoli bit con un contatore so che si puo' fare
> con degli shift,ma non so' come.
>
> Grazie
>> Spectre



Ho trovato questa strada e sembra andare bene.Mi chiedo se è la versione
più compatta possibile.



int bits(unsigned i) {
int n = 0;
while (i) {
i &= i-1;
++n;
}
return n;
}


Saluti

Spectre
 #3  
14.10.2008, 15:26
brix99luftballons
Spectre ha scritto:
> Spectre ha scritto:
>int numBit(unsigned char bits)

{
int nBits=0;
while(bits)
{
if(0 != ((bits= (bits>>1))&0x1) )
nBits++;
}
return(nBits);
}

int numBit(unsigned char bits)
{
int nBits=0;

while( bits )
{
nBits += (bits&0x1)
bits = (bits >>1)
}
return(nBits);
}

B.
 #4  
14.10.2008, 20:06
blisca
"Spectre" <spectre> ha scritto nel messaggio
news:30a8
> Ciao a tutti,
>
> dovrei contare tutti i bit = 1 all'interno di un byte.
>
> Ad esempio,se il mio byte pippo è 11100000 in binario,la somma di tutti
> gli 1 è 3.
>
> Senza dover puntare ai singoli bit con un contatore so che si puo' fare
> con degli shift,ma non so' come.
>
> Grazie
>> Spectre


per me questo che hai trovato è una figata,con al massimo 8 loops e in poche
righe ottiene lo scopo,non lo conoscevo

int bits(unsigned i) {
int n = 0;
while (i) {
i &= i-1;
++n;
}
return n;
}
 #5  
14.10.2008, 23:33
POWERMOS
"blisca" <bliscachiocciolinatiscalipuntoit> ha scritto nel messaggio
news:baef
>
> "Spectre" <spectre> ha scritto nel messaggio
> news:30a8
>
> per me questo che hai trovato è una figata,con al massimo 8 loops e in
> poche
> righe ottiene lo scopo,non lo conoscevo
>
> int bits(unsigned i) {
> int n = 0;
> while (i) {
> i &= i-1;
> ++n;
> }
> return n;
> }
>>


Trovate questo ed altri metodi qua

http://gurmeetsingh.wordpress.com/20...ting-routines/

Ciao
Pow
 #6  
15.10.2008, 15:07
lowcost
Spectre ha scritto:
> dovrei contare tutti i bit = 1 all'interno di un byte.


ma devi calcolare la parita' oppure contare gli uni ?
deve essere per forza in C ?

la parita' in asm puo' essere + compatta, dipende dal set di istruzioni.

saluti
 #7  
15.10.2008, 22:23
Due di Picche
Pestando alacremente sulla tastiera lowcost <die.spam>
ebbe l'ardire di profferire:

> Spectre ha scritto:
> > dovrei contare tutti i bit = 1 all'interno di un byte.

>
> ma devi calcolare la parita' oppure contare gli uni ?


E' la stessa cosa!
 #8  
15.10.2008, 23:10
crowned32
On 14 Ott, 11:21, Spectre <spec> wrote:
> Ciao a tutti,
>
> dovrei contare tutti i bit = 1 all'internodiunbyte.
>
> Ad esempio,se il miobytepippo è 11100000 in binario,la sommaditutti
> gli 1 è 3.
>
> Senza dover puntare ai singoli bit conuncontatore so che si puo' fare
> con degli shift,ma non so' come.


Al di là di tutti i possibili algoritmi, il metodo più veloce e più
semplice è quello di testare l'apposito flag di parità della CPU.
Sfortunatamente non tutte le CPU hanno questo flag e comunque
è accessibile solo da assembly.
 #9  
16.10.2008, 15:27
lowcost
Due di Picche ha scritto:
> Pestando alacremente sulla tastiera lowcost <die.spam>
> ebbe l'ardire di profferire:
>
>> Spectre ha scritto:
>>> dovrei contare tutti i bit = 1 all'interno di un byte.

>> ma devi calcolare la parita' oppure contare gli uni ?

>
> E' la stessa cosa!
>


certo, certo, hai ragione.
infatti la parita' di 11100000 e' 3 , vero ?
 #10  
16.10.2008, 19:27
Due di Picche
Pestando alacremente sulla tastiera lowcost <die.spam>
ebbe l'ardire di profferire:

> >>> dovrei contare tutti i bit = 1 all'interno di un byte.
> >> ma devi calcolare la parita' oppure contare gli uni ?

> >
> > E' la stessa cosa!
> >

>
> certo, certo, hai ragione.
> infatti la parita' di 11100000 e' 3 , vero ?


Ehm... scusa, ma è evidente che non hai afferrato il concetto di
"parità". Non si tratta di sapere se un dato byte è pari o dispari...
Forse su wikipedia puoi farti una piccola cultura:

[url down]

Per poter applicare quindi il calcolo della parità (pari o dispari) è
necessario CONTARE quanti 1 sono presenti nel byte.
 #11  
16.10.2008, 22:14
lowcost
Due di Picche ha scritto:
> Pestando alacremente sulla tastiera lowcost <die.spam>
> ebbe l'ardire di profferire:
>
>
> Ehm... scusa, ma è evidente che non hai afferrato il concetto di
> "parità". Non si tratta di sapere se un dato byte è pari o dispari...
> Forse su wikipedia puoi farti una piccola cultura:
>
> [..]
>
> Per poter applicare quindi il calcolo della parità (pari o dispari) è
> necessario CONTARE quanti 1 sono presenti nel byte.
>


mah, tu dici che e' necessario contare gli uni ?

forse perche' e' l' unico modo che conosci e che usi.

vuoi imparare qualcosa sulla parita' ?

e' un bit (1 oppure 0).
non e' il numero di uni (che nell' esempio dell' OP sono 3).
e la parita' (even) di 11100000 e' 1, non e' 3 !

se leggi bene sul tuo link di wikipedia:

.....
A vuole trasmettere: 1001
A calcola il bit di parità: 1^0^0^1 = 0
.....

lo vedi ? non e' due, e' zero!

per calcolare la parita' non e' assolutamente necessario contare gli uni
perche' il risultato e' un solo unico piccolo bit, che si puo' calcolare
senza contatori (come si fa in hardware).

ti saluto.
 #12  
16.10.2008, 22:30
Due di Picche
Pestando alacremente sulla tastiera lowcost <die.spam>
ebbe l'ardire di profferire:

> mah, tu dici che e' necessario contare gli uni ?


Eh, si. E' uno dei metodi. Quindi chiedersi PERCHE' si vogliano
contare gli uno per calcolare la parità non è saggio.

> e' un bit (1 oppure 0).


Eh grazie. Ma ti assicuro che SO BENE cosa sia.

> non e' il numero di uni (che nell' esempio dell' OP sono 3).
> e la parita' (even) di 11100000 e' 1, non e' 3 !


LOL. Ma con chi credi di parlare? Hai letto bene cosa ho scritto?

> lo vedi ? non e' due, e' zero!


Ma rotfl. Ma ci sei o ci fai? 1001 sono DUE uno. Il bit di parità
vale quindi ZERO perchè il numero di uno è GIA' pari. Ti ripeto: SO
COSA SIA LA PARITA'-

> per calcolare la parita' non e' assolutamente necessario contare gli uni
> perche' il risultato e' un solo unico piccolo bit, che si puo' calcolare
> senza contatori (come si fa in hardware).


Certo. Lo si fa anche in altri modi, però magari non sono poi così
performanti...
http://groups.google.com/group/comp....041435b?hl=en&


C'è di mezzo un'elevazione a potenza e cito:

"...If this code is critical for performance, as it is in some
applications, I think the last three lines beginning with "x ="
should be replaced by the table lookup..."
 #13  
17.10.2008, 07:44
brix99luftballons
Due di Picche ha scritto:
[..]
>
> C'è di mezzo un'elevazione a potenza e cito:
>
> "...If this code is critical for performance, as it is in some
> applications, I think the last three lines beginning with "x ="
> should be replaced by the table lookup..."
>>

>

se ci sono problemi di prestazioni, una bella lookup table e' il
sistema piu' veloce, in alternativa una tabella compressa
a bit potrebbe essere un compromesso...

static
unsigned char TAB_PARITY[]={
0x69, 0x96, 0x96, 0x69, 0x96, 0x69, 0x69, 0x96,
0x96, 0x69, 0x69, 0x96, 0x69, 0x96, 0x96, 0x69,
0x96, 0x69, 0x69, 0x96, 0x69, 0x96, 0x96, 0x69,
0x69, 0x96, 0x96 ,0x69, 0x96, 0x69, 0x69, 0x96
};

char isParityEven(unsigned char p)
{
return( TAB_PARITY[(p/8)]&(1<<(p%8)) );
}

Volendo evitare lo shift:

char isParityEven(unsigned char p)
{
static
unsigned char TAB_MASK[]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80};
return( TAB_PARITY[(p/8)]&TAB_MASK[(p%8)]);
}

B.
 #14  
17.10.2008, 08:20
Marco Trapanese
Due di Picche ha scritto:

> [..]
>
> C'è di mezzo un'elevazione a potenza e cito:




Scusate se mi intrometto. Per curiosità, dove vedi l'elevazione a potenza?

Marco / iw2nzm
 #15  
17.10.2008, 13:40
Due di Picche
Un bel giorno, Marco Trapanese <marcotrapaneseNOSPAM> ebbe
l'ardire di profferire:

> Scusate se mi intrometto. Per curiosità, dove vedi l'elevazione a potenza?
>
> Marco / iw2nzm


Hai ragione, è uno xor. Non cambia però lo stato delle cose. Alla
fine che si adotti un metodo o un'altro sempre gli uno si contano...

Discussioni simili
Buffer (void *) a cui accede byte a byte

Nelle mie applicazioni mi ritrovo spesso a dover passare ad una funzione il puntatore ad un buffer in memoria. Come ho visto fare nelle varie funzioni di libreria (vedi...

come posso spostare un byte all'interno di un'altro byte?

mi spiego,ho 2 byte già definiti(tipo:11110000 e 10001000)e voglio che il secondo byte entri parzialmente nel primo occupandone i primi 3 bit ,quindi con un byte risultante...

Integer=byte*byte [OVERFLOW?]

Ciao a tutti il seguente codice Dim nRighe As Byte Dim nColonne As Byte Dim nElementi As Integer Dim i As Byte Dim ii As Byte Dim index As Integer

Conversione byte->string->byte

Scusate la domanda banale, ma non riesco a capire che cosa devo fare per passare da dati di tipo byte a dati di tipo stringa e ritornare successivamente a tipi byte. var...

Calcolare la dimensione in byte

Salve, ho un problema. Sto cercando qualche chiamata API in grado di dirmi una cartella quanti byte occupa e quanti files contiene. Sono riuscito a fare questo, ma purtroppo...


Tutti gli orari sono GMT. Attualmente sono le 13:36. | Privacy Policy