Newsgroup: it.comp.programmare
Titolo: Numero di bit

Salve a tutti!
Ho un numero memorizzato in un int qualsiasi, e volevo sapere quanti 'uni'
sono contenuti in quel numero nel suo formato binario: in pratica il numero
in questione è tipo un eflags e devo sapere quanti 'uni' ci sono per sapere
quanti flag sono settati.
grazie
ciao
-- 
daniele_athome

 quanti flag sono settati.
propongo questa soluzione, non testata:
int nMask;  // qui ci metti una copia dei flag
.
.
.
int nBits = 0;
for (int i = 0; i < sizeof(int) * 8; i++) {
	nMask >>= 1;
	if (nMask & 1) {
		nBits++;
	}
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 }
Il test va fatto prima dello shift, altrimenti mi pare si perda 
il bit meno significativo.
Steve. 

Steve Aletto wrote:

Ho migliorato il tuo metodo e ora è più corto... Grazie del tuo aiuto
ciao
-- 
daniele_athome

 il bit meno significativo.
Giusto. Se poi vuoi fare il fico con gli amici puoi farlo così:
for(int nBits=0;nMask=(nMask&1&&++nBits,nMask>>1););
Ed è anche leggermente più veloce in parecchi casi... :-)
-- 
/* Costantino Grana                                */
main(int c,char**o){char*s=c?"+L7?+;:7?+:OKIK+9?;9=;"
":+9?;:<:;+9?;;;:;+9<:;<::;+RLJ;K9+":1[o],t,a=!c,m;do
for (m=*s-'0',t=a?m/c:m%c;m>>7?c=1<<m+8,!a&&puts(&a)*
*&a:t--;printf("  \0/*"+a));while ((a^=3)||a[++s]);;}
/* Original code due to Chris Brown... impressive! */

 Ed è anche leggermente più veloce in parecchi casi... :-)
Beh se proprio si vuole esagerare.. dare uno sguardo alle istruzioni per 
le operazioni sui bit non fa male.. chissà che non spunti qualcosa del 
tipo BTC dest, src
antonio

> for(int nBits=0;nMask=(nMask&1&&++nBits,nMask>>1););
nBits va necessariamente definito fuori dal for, altrimenti non 
lo si può più utilizzare, il che farebbe diventare tutto 
inutile.
Steve. 

Steve Aletto wrote:

Mi sono abituato male con il VC6... il seguente programma compila 
perfettamente! :-)
Anzi se mi sai dire come limitare la visibilità di quel nBits te ne sarei 
grato. Ho avuto proprio questo problema durante la coinversione di alcuni 
programmi.
#include <stdio.h>
void main (void)
{
    int nMask = 0x010204f3;
    for(int nBits=0;nMask=(nMask&1&&++nBits,nMask>>1););
    if (nBits==9)
        printf ("hai vinto");


 di alcuni programmi.
Prima provare e poi domandare... a parte che volevo dire "conversione", 
bisogna checkare "Disable language extension" sotto C/C++ -> Customize nei 
project settings. Non l'avevo mai visto!


 il bit meno significativo.
doh!! hai ragione!! ^_^'
che figura... ^^'
piccola distrazione... :P


Ho migliorato il tuo metodo e ora č piů corto... Grazie del tuo aiuto
Non so se ti serve ancora, ma mi sono trovato ad avere la stessa tua
necessita' (no, non sto scrivendo un sistema operativo). Ho fatto un
po' di test e questo sistema e' piu' veloce:
int bitcount(unsigned long w)
{
        int f;
        f  = w & 0x11111111;
        f += (w >> 1) & 0x11111111;
        f += (w >> 2) & 0x11111111;
        f += (w >> 3) & 0x11111111;
        f = (f & 0x0F0F0F0F) + ((f >> 4) & 0x0F0F0F0F);
        f = (f & 0x00000F0F) + (f >> 16);
        f = (f & 0xFF) + (f >> 8);
        return f;
}
(compilandolo con il compilatore Intel ottengo velocita' esattamente
doppie che con il gcc 4.0.1; e il codice gcc compilato per pentium3,
con gcc 4.0.1, su uno Xeon, gira il 10% piu' veloce. Quindi, dipende
molto dal codice prodotto dal compilatore).
Leonardo
-- 
Nach doiligh domhsa mo chailin a mholadh
'S ni he amhain mar bhi si or
Bhi si mar gath greine a dhul in eadan na gloinne
Is bhi sceimh mhna na finne le mo cailin or

 po' di test e questo sistema e' piu' veloce:
[...]
Ma porc... ci ho messo 20 minuti per capire come funzionava! L'idea di usare 
i mezzi byte come fossero variabili separate dato che non si genera il 
riporto č geniale e ha vinto tutti i premi. Peccato che non esista la 
raccolta dei messaggi migliori del newsgroup!


riporto
L'idea mi era venuta da questo file, la funzione "parity".
http://paul.rutgers.edu/~rhoads/Code/bitops2.c
Sospetto che si possa far di meglio rispetto al mezzo byte;
l'implementazione e' abbastanza alla "cotto e mangiato". Ma
ora che funziona non ho molte scuse per perderci dietro del
tempo ulteriore; e' probabile che le migliorie non superino
qualche percento.
Ora devo trovare il sistema di chiamarla meno, la funzione,
oltre a fare prima quando la chiamo :-)
Leonardo e la legge di Amdahl


 Leonardo e la legge di Amdahl
Argh. Questa almeno me la ricordo, e con i nuovi Chip Multi Processor, ho 
paura che in parecchi se la dovranno riguardare.
Per curiosità, hai avuto disavventure con ragazze dai capelli rossi? :-)
No, non so il gaelico, è Internet che aiuta.


Per curiosità, hai avuto disavventure con ragazze dai capelli rossi? :-)
Al contrario... ma e' una storia lunga e complicata :-)
Leonardo
