Возьмите XOR из 2 чисел (скажем, a & b) и сосчитайте количество единиц в a ^ b
int bitsSwapRequired (int a, int b){
int count = 0;
for (int c = a ^ b; c!=0 ; c >> 1)
count += c & 1;
return count;
}
Мы можем сделать его немного лучше, вместо простого многократного сдвига c при проверке младшего значащего бита, мы можем непрерывно переключать крайний правый бит, установленный в 1, и подсчитывать, сколько времени требуется c для достижения 0. Операция c = c & (c-1) очистит крайний правый бит, установленный на 1 в c.
int bitsSwapRequired (int a, int b){
int count = 0;
for (int c = a ^ b; c != 0; c = c & (c-1))
count ++;
return count;
}