если вы XOR 2 значения вместе, вы останетесь только с битами, которые отличаются.
Вам нужно только посчитать биты, которые все еще равны 1, и у вас есть ответ
в с:
unsigned char val1=12;
unsigned char val2=123;
unsigned char xored = val1 ^ val2;
int i;
int numBits=0;
for(i=0; i<8; i++)
{
if(xored&1) numBits++;
xored>>=1;
}
хотя, возможно, есть более быстрые способы подсчета битов в байте
(например, вы можете использовать таблицу поиска для 256 значений)