programing

숫자가 짝수인지 홀수인지 확인하는 가장 빠른 방법은 무엇입니까?

kingscode 2022. 7. 15. 22:03
반응형

숫자가 짝수인지 홀수인지 확인하는 가장 빠른 방법은 무엇입니까?

숫자가 짝수인지 홀수인지 확인하는 가장 빠른 방법은 무엇입니까?

은 잘 알려져 있다

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_B3개의 명령어가 더 필요합니다.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 !=

이것은 무엇을 의미합니까?최적화 도구는 일반적으로 이러한 간단한 작업에서는 가장 명확한 코드만으로도 최고의 효율성을 보장할 수 있을 만큼 충분히 정교합니다.

(x & 1)이 참이면 홀수이고, 그렇지 않으면 짝수입니다.

일반적인 방법:

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에 컴파일됨) - I knowledge using the instructions.divmodulo 명령어가 너무 느려서 테스트를 전혀 안 했어요.

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

아, 잠깐, 제일 빠른 길이라면서 재미없다고 했잖아.제 잘못입니다;)

위의 함수는 물론 양수에 대해서만 작동합니다.

마지막 비트가 1인지 확인합니다.

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

질문이 완전히 지정되지 않았습니다.어쨌든 답은 컴파일러와 머신의 아키텍처에 따라 달라집니다.예를 들어, 기계에서 한 개의 보완 기호 또는 두 개의 보완 기호 번호를 사용하고 있습니까?

첫 번째, 두 번째, 간결한 세 번째, 빠른 마지막 순서로 코드를 작성합니다.따라서 이 루틴을 다음과 같이 코드화합니다.

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

이 방법은 정확하고 LSB를 테스트하는 것보다 더 명확하게 의도를 표현하며, 간결하고, 믿거나 말거나, 매우 빠르게 진행되고 있습니다.프로파일링에서 이 방법이 어플리케이션의 병목현상이라고 판단되는 경우에만 이 방법을 벗어나는 것을 고려할 것입니다.

정수라면 아마 최하위 비트를 체크하는 것만으로 알 수 있습니다.0은 그렇더라도 세어집니다.

휴대 방법은 계수 연산자를 사용하는 것입니다.%:

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

2개의 보완 아키텍처에서만 실행할 예정이라면 조금 더 현명하게 사용할 수 있습니다.

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

계수 연산자를 사용하면 비트에 비해 코드가 느려질 수 있습니다.다만, 다음의 조건이 모두 충족되지 않는 한, 그대로 사용합니다.

  1. 어려운 퍼포먼스 요건을 충족하지 못하고 있다.
  2. 중입니다.x % 2많은 것(수천 번 실행되는 엄격한 루프로 말한다);
  3. 프로파일링은 mod 연산자의 사용이 병목 현상임을 나타냅니다.
  4. 또한 프로파일링은 비트를 사용하면 병목현상이 해소되어 성능 요건을 충족할 수 있음을 나타냅니다.

마지막 자리만 보고 짝수인지 홀수인지 확인하면 안 돼요?

{1, 3, 5, 7, 9}

{0, 2, 4, 6, 8}

추가 정보:OP에는 숫자가 주어진다고 쓰여있기 때문에 이 답변을 작성할 때 그것을 따랐습니다.이 답은 짝수/홀수의 정의에 따라 수학적으로도 정확합니다.사용 사례에 따라 마지막 숫자를 확인하는 것만으로 수학적으로 일관된 결과를 얻을 수 있습니다.

주의: 입력이 int 또는 유사한 값 유형이 아닌 경우 해당 값 유형으로 변환한 후 마지막 숫자를 확인할 수 있습니다.

bool is_odd = number & 1;
int i=5;
if ( i%2 == 0 )
{
   // Even
} else {
   // Odd
}

최하위 비트를 확인합니다.

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

언급URL : https://stackoverflow.com/questions/2229107/what-is-the-fastest-way-to-find-if-a-number-is-even-or-odd

반응형