Программирование на C: Как можно сравнить два типа без == - PullRequest
0 голосов
/ 21 февраля 2012

Мне было интересно, как компилятор C будет обрабатывать оператор сравнения '=='

Я хочу создать функцию (в C), которая сравнивает две вещи без использования ==. Я думаю, что это можно сделать каким-то образом, используя побитовые операторы (&, |, ^, >>), однако я не могу думать о том, как это сделать.

У кого-нибудь есть идеи?

Спасибо!

Ответы [ 6 ]

6 голосов
/ 21 февраля 2012

Вот простой способ проверить, равны ли два целых без использования ==:

int x = 3;
int y = 3;

if(x < y || y < x)
    printf("Not equal");
else
    printf("Equal");
1 голос
/ 21 февраля 2012

Без использования ==:

int is_a_equal_to_b(int a, int b)
{
    if (a > b || a < b) return 0; /* Not equal. */
    return 1;                     /* Equal.     */
}
1 голос
/ 21 февраля 2012

Для целочисленных типов будет работать if (!(a - b)).

Вы можете столкнуться с некоторыми забавными проблемами с другими типами.

Возможно if (!(a ^ b))?

0 голосов
/ 21 февраля 2012

Другие ответы хороши, но если вам нужны только побитовые операторы, сделайте что-то вроде:

int is_equal(int a,int b) {
 int bit=1;
 while(bit) {
  if ((a&bit)^(b&bit)) return 0;
  bit<<=1;
 }
 return 1;
}
0 голосов
/ 21 февраля 2012

Поскольку вам интересно, как компилятор это делает, он переводит == в машинный код, который содержит инструкцию cmp.Эта инструкция сравнивает два операнда и сохраняет результат сравнения.Результат можно проверить, чтобы увидеть, были ли операнды равны, не равны, меньше, больше, и т. Д.

В случае использования == в операторе if, это, вероятно, сгенерирует что-токак это:

cmp op1, op2
jne else_address

, что в основном означает «Сравните два значения.Если они не равны, перейдите к блоку else. '

0 голосов
/ 21 февраля 2012

Что если вы инвертируете каждый бит одного из значений, а затем "&" два значения вместе.Если результат равен нулю, то они должны быть равны.

int x=5;
int y=5;
int z=(~x)&y;

if(!(y>0||y<0)){
   //Values are equal. 
}

Почему бы вам не использовать оператор "=="?

...