Подтвердить что ты не робот

Каков самый быстрый способ определить, является ли число четным или нечетным?

Каков самый быстрый способ определить, является ли число четным или нечетным?

4b9b3361

Ответ 1

Хорошо известно, что

static inline int is_odd_A(int x) { return x & 1; }

более эффективен, чем

static inline int is_odd_B(int x) { return x % 2; }

Но с включенным оптимизатором is_odd_B не будет отличаться от is_odd_A? Нет - с gcc-4.2 -O2, мы получаем (в сборке ARM):

_is_odd_A:
    and r0, r0, #1
    bx  lr

_is_odd_B:
    mov r3, r0, lsr #31
    add r0, r0, r3
    and r0, r0, #1
    rsb r0, r3, r0
    bx  lr

Мы видим, что is_odd_B принимает еще 3 команды, чем is_odd_A, основная причина в том, что

((-1) % 2) == -1
((-1) & 1) ==  1

Однако, все следующие версии будут генерировать тот же код, что и is_odd_A:

#include <stdbool.h>
static inline bool is_odd_D(int x) { return x % 2; }      // note the bool
static inline int  is_odd_E(int x) { return x % 2 != 0; } // note the !=

Что это значит? Оптимизатор, как правило, достаточно сложный, что для этих простых вещей самый ясный код достаточно, чтобы гарантировать лучшую эффективность.

Ответ 2

Обычный способ сделать это:

int number = ...;
if(number % 2) { odd }
else { even }

Альтернатива:

int number = ...;
if(number & 1) { odd }
else { even }

Протестировано на GCC 3.3.1 и 4.3.2, оба имеют одинаковую скорость (без оптимизации компилятора), поскольку оба результата приводятся в инструкции and (скомпилированы на x86) - я знаю, что с помощью команды div для modulo будет намного медленнее, поэтому я вообще не тестировал его.

Ответ 3

bool is_odd = number & 1;

Ответ 4

если (x и 1) истинно, то это нечетно, в противном случае это даже.

Ответ 5

int i=5;
if ( i%2 == 0 )
{
   // Even
} else {
   // Odd
}

Ответ 6

Если это целое число, возможно, просто проверив младший значащий бит. Нуль будет считаться, хотя даже.

Ответ 7

Портативный способ заключается в использовании оператора модуля %:

if (x % 2 == 0) // number is even

Если вы знаете, что вы только собираетесь работать на двух архитектурах дополнений, вы можете использовать поразрядные и:

if (x & 0x01 == 0) // number is even

Использование оператора модуля может привести к более медленному коду относительно побитового и; однако, я бы придерживался его, если не все верно:

  • Вы не справляетесь с жесткими требованиями к производительности;
  • Вы выполняете x % 2 много (скажем, в замкнутом цикле, который выполняется тысячи раз);
  • Профилирование указывает, что использование оператора mod является узким местом;
  • Профилирование также указывает, что использование побитового - и устраняет узкое место и позволяет удовлетворить требования к производительности.

Ответ 8

Убедитесь, что последний бит равен 1.

int is_odd(int num) {
  return num & 1;
}

Ответ 9

int is_odd(int n)
{
   if (n == 0)
      return 0;
   else if (n == 1)
      return 1;
   else
      return !is_odd(n - 1);
}

О, подождите, вы сказали, что это самый быстрый способ, не самый смешной. Мой плохой;)

Выше функция работает, конечно, только для положительных чисел.

Ответ 10

Ваш вопрос не полностью указан. Независимо от того, ответ зависит от вашего компилятора и архитектуры вашей машины. Например, вы работаете на машине с использованием одного дополнения или двух дополняемых подписью чисел?

Я пишу свой код, чтобы быть правильным первым, вторым, кратким третьим и быстрым последним. Поэтому я бы запрограммировал эту процедуру следующим образом:

/* returns 0 if odd, 1 if even */
/* can use bool in C99 */
int IsEven(int n) {
    return n % 2 == 0;
}

Этот метод верен, он более четко выражает намерение, чем тестирование LSB, он кратким и, верьте или нет, он быстро вспыхивает. Если и только если профилирование говорит мне, что этот метод был узким местом в моей заявке, я бы подумал об отступлении от него.

Ответ 11

Проверьте младший бит:

if (number & 0x01) {
  // It odd
} else {
  // It even
}

Ответ 12

Оператор printf() обрабатывает группу символов как массив. Я думаю, это самая простая и быстрая программа для ODD EVEN.

Void main()
{
int n;
clrscr();
printf("Even\0Odd"+((n%2)*5));
getch();
}