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
Version imprimable
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 >>=.
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:
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é parCode:if ((p.v[i][j]&pow(2,k))>>k==1) {compt++;}
Code: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: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.
cool je comprend
moi aussi je compte mes bits de 0 à 31 même si ceux qui m'intèresse c'est de 4 à 31.
donc c tout bon pa besoin de mettre k+1.
merci encore
à+
moi jai une fonction comme sa qui me retourne l'etat d'un bit en particuluier
si sa pe taiderCode:
1
2
3
4
5
6
7
8
9
10
11 int FonctioRetourneBit ( int iBit ) { //bon c'est une fonction plus complexe qui normalement cherche encore une //case en particulier dans le tableau (normalement il y a 3 arguments, //mais sa sa sufie a comprendre le principe :) if((Form1->TabValeurIndex[1]>>iBit)& 0x01) return 1; else return 0; }
Cordialement Baxter