uint64_t bitsToInt64(char *bs) {
uint64_t r, i;
r = 0;
for(i = 0; i < 64; i++)
if(bs[i] == 1)
r |= 1LL << i;
return r;
}
int countBits64(uint64_t i) {
uint64_t x, t;
t = 0LL;
for(x = 0LL; x < 64LL; x++) {
if(i & (1LL << x))
t += 1;
}
return t;
}
char bits [] = {
0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,};
uint64_t mask = bitsToInt64(bits);
int nbits = countBits64(mask);
printf("%d", nbits);
L'impression ci-dessus est "1". Qu'est-ce que je fais mal?Le comptage des bits sur une longue durée ne fonctionne pas comme prévu
Quelle est la sortie si vous faites 'printf ("% ld ", mask);' avant la dernière ligne? – Chriszuma
Je ne pense pas que ce soit le seul problème, mais vous devriez utiliser '1ULL' au lieu de' 1LL', car un '1 << 63' ne rentre pas dans un long signé. Pouvez-vous imprimer 'mask' afin que nous puissions déterminer quelle est la fonction du bug? – ughoavgfhw
printf ("% llu", masque); imprime 10. Mais le bitsToInt64() doit fonctionner avant que j'utilise uint64_t en tant que bitboards pour les pièces d'échecs et ils obtiennent/règlent tous correctement ... –