C - Необходимо сравнить `n` младших битов int для равенства - PullRequest
4 голосов
/ 13 сентября 2009

C - нужно сравнить n младшие биты целого числа для равенства.

т.е. n = 4;

xxxx1001 == xxxx1001 (х не важно)

т.е. n = 2; xxxxxx01 == xxxxxx01

Не могу придумать хороший способ сделать это без масок, =).

Ответы [ 7 ]

25 голосов
/ 13 сентября 2009

Создать маску из числа битов:

int mask = (1 << bits) - 1;

Затем вы используете это для сравнения значений:

if ((a & mask) == (b & mask))
9 голосов
/ 13 сентября 2009

Если вы действительно не хотите использовать маски (не то, что с этим что-то не так!), Вы можете использовать оператор shift-left:

if( a << m == b << m )
{
}

где m - общее количество битов, меньше интересующего вас числа. То есть в примере в вопросе m равно 4 (т. Е. 8 - 4).

Редактировать: чтобы быть ясным - я предположил, что вопрос указывает 8-битное целое число, учитывая используемый формат (например, xxxx1001), но решение является общим в том, что оно обслуживает любое целое число. Чтобы определить количество бит в целом числе, используйте 8 * sizeof (тип), где типом может быть int, short, long и т. Д.

4 голосов
/ 13 сентября 2009

Я думаю, что нужно сделать xor значений и затем использовать маску. Например,

(a ^ b) & (( 1<<n ) - 1)
2 голосов
/ 14 сентября 2009

Попробуйте это:

int i;
int theSame = 1;
for (i = 0; i < n; i++)
{
    if !(a >> i & 1) || !(b >> i & 1)
    {
        theSame = 0;
        break;
    }
}
0 голосов
/ 29 июня 2012

Я предполагаю, что 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) в таком краевом случае.

0 голосов
/ 13 сентября 2009

Что не так с масками?

(a & 0x1111) == (b & 0x1111)
0 голосов
/ 13 сентября 2009

вы можете использовать оператор по модулю. Например, n = 4, и вам нужно ввести целые числа x и y:

if((x%16) == (y%16)){ ....

Надеюсь, это поможет вам.

Ник

...