summaryrefslogtreecommitdiff
path: root/set_bitsets.c
diff options
context:
space:
mode:
authorMendes Oulamara <oulamara@clipper.ens.fr>2013-12-05 09:21:22 +0100
committerMendes Oulamara <oulamara@clipper.ens.fr>2013-12-05 09:21:22 +0100
commit50b5699f9b6d887c31e546168d9e588b36e3f876 (patch)
tree6f984a6a671866a06ebaaaf4566f4b73fe677eb0 /set_bitsets.c
parent42af2c9cb9c86ff7d92062d8a535015b852647e6 (diff)
parentcbffb4f8d60a8516b23aae1bdf07197787ddce2c (diff)
downloadAlgoProg-Projet-50b5699f9b6d887c31e546168d9e588b36e3f876.tar.gz
AlgoProg-Projet-50b5699f9b6d887c31e546168d9e588b36e3f876.zip
Merge branch 'master' of /users/13/info/oulamara/Work/../../auvolat/boulot/AlgoProg-Projet
Diffstat (limited to 'set_bitsets.c')
-rw-r--r--set_bitsets.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/set_bitsets.c b/set_bitsets.c
index 7eddcfd..4ac8462 100644
--- a/set_bitsets.c
+++ b/set_bitsets.c
@@ -21,10 +21,22 @@ int nbCells(int n){ //the mathematical ceil function
}
int nb_one(unsigned long long x) { //the hamming weight of x
- int cnt = 0, i;
- for(i = 0; i < SCOD; i++)
- cnt+= ((x>>i)&1);
- return cnt;
+ assert(SCOD==64);
+
+ //1
+ x = (x & 0x5555555555555555) + ((x >> 1) & 0x5555555555555555); // mask : 0101010101...
+ //2
+ x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); // mask : 001100110011...
+ //4
+ x = (x & 0x0F0F0F0F0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F0F0F0F0F); // mask : 000011110000....
+ //8
+ x = (x & 0x00FF00FF00FF00FF) + ((x >> 8) & 0x00FF00FF00FF00FF); // etc.
+ //16
+ x = (x & 0x0000FFFF0000FFFF) + ((x >> 16) & 0x0000FFFF0000FFFF);
+ //32
+ x = (x & 0x00000000FFFFFFFF) + ((x >> 32) & 0x00000000FFFFFFFF);
+
+ return x;
}
int set_size(const set s){