Scusate è la terza volta che vi rompo le scatole, ma sto proprio agli inizi e mi capita spesso di incappare in problemi stupidi XD

Il mio esercizio è:

Scrivere una funzione int ones(int a, int b, int k) che ritorna il numero di interi compresi tra a e b che nella rappresentazione binaria hanno esattamente k uno. Si assuma che b >= a >= 0 e che k >= 0. Ad esempio, se a = 0, b = 7 e k = 2, la funzione ritorna 3; se a = 0, b = 15, k = 3, ritorna 4; se a = 12, b = 67, k = 3, ritorna 19; se a = 12, b = 67, k = 7, ritorna 0.


Il mio codice è:

codice:
 #include <stdio.h>
#include <stdlib.h>

int ones (int a, int b, int k);

int main(void) {
	int a, b, k;
	printf("Inserire a, b, k \n");
	scanf ("%d %d %d", &a, &b, &k);
	printf ("Il numero di numeri con K uni è: \n %d \n", ones (a,b,k));

}


int ones (int a, int b, int k){
	int cnt=0;
	int x=a;
	int ones=0;
	 for (; a<=b; a++){
		 x=a;
		while (x!=0){
		if (x%2==1) cnt++;
		x/=2;
		}
		if (cnt == k) ones++;
	 }

	return ones;
}


Non funziona però, ad esempio per i valori esempio dell'esercizio 12 67 e 3 mi restituisce 0.
Qualcuno mi può spiegare COSA e PERCHÈ è sbagliato senza darmi il codice corretto ? (vorrei provarci da solo :P)


Grazie mille e scusate l'assillo