hilpers


  hilpers > hobby.* > hobby.elettronica.digitale

 #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
Discussione Ha iniziato questa discussione
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...

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

romeo
Lettura byte a byte dell'HDD

Salve, Come da oggetto, avrei bisogno di leggere byte a byte ogni singolo cluster del mio HDD. Potete indicarmi se esiste una qualche libreria, un componente o quant'altro in...

Kayn
prendere i byte in parole di 2 byte

Salve a tutti. Ho un problema che non so risolvere. Ho bisogno di codificare una sequenza numerica in un'altra sequenza numerica. Mi spiego meglio. Supponiamo di aver...

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

Maxtor

Privacy Policy | Tutti gli orari sono GMT. Attualmente sono le 07:30.

Merging Information Logo
[Deutschland] [España] [France] [Nederland] [Polska] [Tech] [United Kingdom]