|
#1
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
"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
|
|
|
|
|
"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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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.
|
|
|