Bonjour
je voudrais coder des entiers en 32 bits
puis compter le nombre de 1 qu'il y a à partir du 5 ième bit
j'ai besoin d' insérer une fonction qui fait cela dans mon programme
sauf que je ne sais pas manipuler les bits
merci pour l'aide
Bonjour
je voudrais coder des entiers en 32 bits
puis compter le nombre de 1 qu'il y a à partir du 5 ième bit
j'ai besoin d' insérer une fonction qui fait cela dans mon programme
sauf que je ne sais pas manipuler les bits
merci pour l'aide
Renseigne-toi sur les opérateurs de combinatoire binaire: &, |, ^, et ~
Ainsi que sur les opérateurs de décalage: <<, >>, sans oublier leurs version "affectation", <<= et >>=.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
en fait c'est ce que j'étais entrain de faire. je viens d'écrire cette fonction sans avoir à transformer mon entier en binaire. puis je compte le nobre de 1 entre le 5 ième bit et le 32ième
est ce que ça a un sens?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int gardiens(int i,int j){ int compt = 0; for (int k = 4; k<=31; ++k) { if ((p.v[i][j]&pow(2,k))>>k==1) {compt++;} } return compt; }
merci
ca doit etre peut etre juste, mais la fonction pow sur des entiers est un peu brutale.
ce que tu veux faire, c'est tester le bit n, alors 1 << n; "allume" le nieme bit d'un entier.
donc tu peux tester p[i][j] & (1 << k)
ensuite tu n'es pas obligé de tester par rapport a un, tu peux juste tester si le resultat est different de 0. par exemple, si le 4eme bit de p[i][j] est "set",
p[i][j] & (1 << 4) est un entier dont le 4eme bit est "set" et tous les autres a 0, en gros il est different de 0 quoi.
donc en gros,
peut etre remplacé par
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ((p.v[i][j]&pow(2,k))>>k==1) {compt++;}
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( (p.v[i][j]&(1<<k)) != 0 ) {compt++;}
merci ça me parait bien ce que tu écrit.
juste une petite question, si je teste (p.v[i][j]&(1<<k)) ça veut dire que je teste le kième bit? car moi je teste le (k+1)ième bit en faisant (p.v[i][j]&pow(2,k))>>k. (p.v[i][j]&pow(2,0) teste le premier et (p.v[i][j]&pow(2,1)>>1 teste le deuxième et ainsi de suite...
donc est ce que je dois mettre?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ((p.v[i][j]&(1<<k+1)) !=0) {compt++;}
alors tout depend. moi j'indexe mes bits de 0 a 31 :p
donc quand je fais 1<<0 je teste le bit numero 0
et 1 << 31 je teste le bit 31
ca me semble plus simple pour calculer (c'est une convention prise par beaucoup de programmeurs C et C++, comme le fait que le premier element d'un tableau soit a l'index 0)
ta boucle va de 4 a 31 il semble donc que tu testes les bits 4 a 31 donc que tu partes de 0.
Partager