Как минимум, есть три сравнения, которые должны произойти
- извлечение знака
- извлечение знака б
- сравните a и b на равенство
Невозможно избежать этих трех вещей.
Вы можете сделать and
, вы можете сделать less than
, на самом деле не имеет значения, какой - вы - вероятно - мог бы найти крутой / умный / хитрый способ сделать это и другим способом. Но вам все равно понадобятся эти три элементарных операции. Там также нет необходимости чрезмерно усложнять это. Если вы ищете что-то, что можно вставить в одну строку, вы можете сделать это:
__int64 mask = 0x8000000000000000; // i think that's the right amount of 0's :-)
if( (x&mask) ^ (y&mask) )
puts("different");
else
puts("same");
Здесь я извлекаю бит и храни их. Если бит одинаков, xor будет 0 (ложь) - если биты разные, xor будет 1 (истина). С хорошим комментарием, объясняющим, что вы делаете и почему, это совершенно правильный способ сделать это.
ОДНАКО: пример, который вы привели как «не используйте это», на самом деле не так уж и плох ... Легко читать, что является одной из самых важных вещей, которые вы можете иметь в своем коде. Существует два правила оптимизации:
- Не делай этого.
- (только для экспертов) Пока не делайте этого.
Не жертвуйте читабельностью ради оптимизации чего-то, что уже чертовски быстро и, вероятно, будет достаточно быстрым. : -)