Я предполагаю, что 4 младших бита равны
Сначала используйте y = (a ^ b), чтобы получить эту битовую комбинацию (x означает неизвестный)
xxxx0000
Затем измените битовую комбинацию с помощью y = ~ y
xxxx1111
Затем определите первые 0 с помощью y ^ = (y + 1)
xxx11111
Затем сдвиньте n раз вправо y >> = n
0000xxx1
Если это не ноль, то младшие n битов были равны
Поэтому мое решение будет
int are_lowest_n_bits_of_a_and_b_equals(int n,int a, int b)
/* return 0 if not equal, or non zero if equal */
{
int y=~(a^b);
return (y^(y+1))>>n;
}
Кажется, он работает даже для n = number_of_bits (int) благодаря распространению знакового бита при знаковом арифметическом сдвиге вправо, но если когда-либо это UB, мы можем просто проверить наличие (a == b) в таком краевом случае.