숫자가 짝수인지 홀수인지 확인하는 가장 빠른 방법은 무엇입니까?
숫자가 짝수인지 홀수인지 확인하는 가장 빠른 방법은 무엇입니까?
은 잘 알려져 있다
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 !=
이것은 무엇을 의미합니까?최적화 도구는 일반적으로 이러한 간단한 작업에서는 가장 명확한 코드만으로도 최고의 효율성을 보장할 수 있을 만큼 충분히 정교합니다.
(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.div
modulo 명령어가 너무 느려서 테스트를 전혀 안 했어요.
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
계수 연산자를 사용하면 비트에 비해 코드가 느려질 수 있습니다.다만, 다음의 조건이 모두 충족되지 않는 한, 그대로 사용합니다.
- 어려운 퍼포먼스 요건을 충족하지 못하고 있다.
- 중입니다.
x % 2
많은 것(수천 번 실행되는 엄격한 루프로 말한다); - 프로파일링은 mod 연산자의 사용이 병목 현상임을 나타냅니다.
- 또한 프로파일링은 비트를 사용하면 병목현상이 해소되어 성능 요건을 충족할 수 있음을 나타냅니다.
마지막 자리만 보고 짝수인지 홀수인지 확인하면 안 돼요?
{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
'programing' 카테고리의 다른 글
컴파일러가 예측 가능한 덧셈 루프를 곱셈에 최적화할 수 없는(또는 그렇지 않은) 이유는 무엇입니까? (0) | 2022.07.15 |
---|---|
b-table의 확인란과 관련된 bootstrap-vue 문제 (0) | 2022.07.15 |
The method in Vue runs twice on click (0) | 2022.07.14 |
NativeScript vue, vuex 및 urlhandler (0) | 2022.07.14 |
Vue.js에서 계산된 속성을 수정하시겠습니까? (0) | 2022.07.14 |