log (base 2) 함수를 작성하는 방법이 있습니까?
C 언어에는 2 개의 내장 기능이 있습니다 .-- >>
1. log베이스 e.
2. log10베이스 10;
하지만 2 진법의 로그 함수가 필요합니다.
log (base 2) 함수를 작성하는 방법이 있습니까?
C 언어에는 2 개의 내장 기능이 있습니다 .-- >>
1. log베이스 e.
2. log10베이스 10;
하지만 2 진법의 로그 함수가 필요합니다.
답변:
적분 결과를 찾고 있다면 값에 설정된 가장 높은 비트를 결정하고 그 위치를 반환 할 수 있습니다.
Integer.highestOneBit(int)방법 i |= (i >> 1); i |= (i >> 2); i |= (i >> 4); i |= (i >> 8); i |= (i >> 16); return i - (i >>> 1);
while (i >>= 1) { ++l; }
i>>32. 그러나 Java에는 32 비트 정수만 있으므로 괜찮습니다. C / C ++의 경우 고려할 필요가 있습니다.
http://en.wikipedia.org/wiki/Logarithm에 명시된대로 :
logb(x) = logk(x) / logk(b)
의미하는 것은:
log2(x) = log10(x) / log10(2)
log()구현에 대한 소스를 볼 수 없으므로 수행하지 않습니다. 내 잘못이야.
log10()C 표준에 정의 된 함수 이므로 컴파일러는 결과를 미리 계산하는 것을 포함하여 "특별히"처리 할 수 있습니다. 제가 @Johannes의 제안이라고 생각합니다.
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 ()를 수행하는 방법은 무엇입니까?
uint16_t log2(uint32_t n) {//but truncated
if (n==0) throw ...
uint16_t logValue = -1;
while (n) {//
logValue++;
n >>= 1;
}
return logValue;
}
기본적으로 tomlogic 과 동일 합니다.
math.h (C) 또는 cmath (C ++)를 포함해야합니다. 물론 우리가 알고있는 수학을 따라야한다는 것을 명심하십시오 ... 숫자> 0 만.
예:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
cout<<log2(number);
}
나는 가장 중요한 비트의 위치보다 더 정밀해야했고, 내가 사용하고있는 마이크로 컨트롤러에는 수학 라이브러리가 없었습니다. 양의 정수 값 인수에 대해 2 ^ n 값 사이의 선형 근사를 사용하는 것이 잘 작동한다는 것을 알았습니다. 다음은 코드입니다.
uint16_t approx_log_base_2_N_times_256(uint16_t n)
{
uint16_t msb_only = 0x8000;
uint16_t exp = 15;
if (n == 0)
return (-1);
while ((n & msb_only) == 0) {
msb_only >>= 1;
exp--;
}
return (((uint16_t)((((uint32_t) (n ^ msb_only)) << 8) / msb_only)) | (exp << 8));
}
내 주 프로그램에서 정수 결과로 N * log2 (N) / 2를 계산해야했습니다.
온도 = (((uint32_t) N) * approx_log_base_2_N_times_256) / 512;
16 비트 값은 모두 2 % 이상 떨어지지 않았습니다.
위의 모든 답변이 정확합니다. 아래 내 대답은 누군가가 필요하면 도움이 될 수 있습니다. C를 사용하여 해결하는 많은 질문에서이 요구 사항을 보았습니다.
log2 (x) = logy (x) / logy (2)
그러나 C 언어를 사용 중이고 결과를 정수로 표시하려면 다음을 사용할 수 있습니다.
int result = (int)(floor(log(x) / log(2))) + 1;
도움이 되었기를 바랍니다.