[c++] C / C ++에서 log base (2)를 작성하는 방법

log (base 2) 함수를 작성하는 방법이 있습니까?

C 언어에는 2 개의 내장 기능이 있습니다 .– >>

1. log베이스 e.

2. log10베이스 10;

하지만 2 진법의 로그 함수가 필요합니다.



답변

간단한 수학 :

    로그 2 ( x ) = log y ( x ) / log y (2)

여기서 y 는 무엇이든 가능하며 표준 로그 함수의 경우 10 또는 e 입니다.


답변

C99에는 log2( log2flog2lfloat 및 long double)이 있습니다.


답변

적분 결과를 찾고 있다면 값에 설정된 가장 높은 비트를 결정하고 그 위치를 반환 할 수 있습니다.


답변

#define M_LOG2E 1.44269504088896340736 // log2(e)

inline long double log2(const long double x){
    return log(x) * M_LOG2E;
}

(곱하기가 나눗셈보다 빠를 수 있음)


답변

log2(int n) = 31 - __builtin_clz(n)


답변

http://en.wikipedia.org/wiki/Logarithm에 명시된대로 :

logb(x) = logk(x) / logk(b)

의미하는 것은:

log2(x) = log10(x) / log10(2)


답변

빠르게 만들고 싶다면 Bit Twiddling Hacks (정수 log2 만 해당) 와 같은 조회 테이블을 사용할 수 있습니다 .

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] =
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

또한 당신은 같은 방법을 내장하여 컴파일러에서 살펴해야 _BitScanReverse하는 가 완전히 하드웨어에서 계산 할 수 있기 때문에 더 빠를 수 있습니다.

중복 가능성도 살펴보십시오 C ++에서 정수 log2 ()를 수행하는 방법은 무엇입니까?