지수 함수의 출력이 입력 값을 초과 할 때까지 아무래도 내 프로그램을 계속 실행 한 다음이를 지수 함수의 이전 출력과 비교해야합니다. 의사 코드 (pseudocode) 일지라도 어떻게 그런 짓을 할 수 있을까요? 대상에 가까운 쪽 1.주어진 입력에 가장 가까운 2^N 값을 찾는 방법은 무엇입니까?
동안 X < 타겟
지수 함수의 출력이 입력 값을 초과 할 때까지 아무래도 내 프로그램을 계속 실행 한 다음이를 지수 함수의 이전 출력과 비교해야합니다. 의사 코드 (pseudocode) 일지라도 어떻게 그런 짓을 할 수 있을까요? 대상에 가까운 쪽 1.주어진 입력에 가장 가까운 2^N 값을 찾는 방법은 무엇입니까?
동안 X < 타겟
이것은 더 빠른 해결책입니다. –
그럼 출력으로 무엇을 표시합니까? 필자의 예에서, 프로그램은 "64"를 출력 할 것입니까? 여기에서 어떤 가치가 있을까요? – Bhaxy
2^y 또는 2^z - 어느 쪽이 입력에 더 가깝습니까? 알고리즘의 차이점은 여기서 2의 모든 가능한 제곱 수를 비교하는 대신 입력으로 2 개의 값만 비교해야한다는 것입니다. –
집합 X 설정 X = 2 * X
그런 다음 복귀 X 또는 X/2. = 로그 (2- 입력) 모두 상하 => Y 1 단계에서 취득 된 값 라운드public static int neareastPower2(int in) {
if (in <= 1) {
return 1;
}
int result = 2;
while (in > 3) {
in = in >> 1;
result = result << 1;
}
if (in == 3) {
return result << 1;
} else {
return result;
}
}
맞는 하나를 선택 예 대신 50.
public static int neareastPower2(int in) {
return (int) Math.pow(2, Math.round(Math.log(in)/Math.log(2)));
}
컴파일러는 nlz 명령을 매핑하는 방법 :
public int nextPowerOfTwo(int val) {
return 1 << (32 - Integer.numberOfLeadingZeros(val - 1));
}
명시 적 루프와 Math.pow
를 사용하여 솔루션에 비해 확실히 더 효율적입니다. numberOfLeadingZeros
에 대해 컴파일러가 생성하는 코드를 보지 않고도 더 많이 말하기가 어렵습니다.
그러면 우리는 쉽게 2의 저력을 얻고 어느 쪽이 더 가까운 지 비교할 수 있습니다. 마지막 부분은 나에게 맞는 각 솔루션에 대해 수행되어야합니다.
사용중인 언어에 따라 비트 단위 연산을 사용하여 쉽게 수행 할 수 있습니다. 단일 1 비트 세트가 입력 값에 설정된 최상위 비트보다 큰 값 또는 입력 값에서 가장 높은 1 비트 세트가있는 값을 원합니다.
가장 높은 세트 비트보다 작은 비트를 모두 1로 설정하면, 다음으로 큰 2의 제곱으로 끝나는 비트를 추가하십시오. 당신은 2의 다음 낮은 힘을 얻고 2의 더 가까운 것을 선택하기 위해 이것을 오른쪽으로 바꿀 수 있습니다.
unsigned closest_power_of_two(unsigned value)
{
unsigned above = (value - 1); // handle case where input is a power of two
above |= above >> 1; // set all of the bits below the highest bit
above |= above >> 2;
above |= above >> 4;
above |= above >> 8;
above |= above >> 16;
++above; // add one, carrying all the way through
// leaving only one bit set.
unsigned below = above >> 1; // find the next lower power of two.
return (above - value) < (value - below) ? above : below;
}
다른 유사한 트릭을 보려면 Bit Twiddling Hacks을 참조하십시오.
다음은 입력 번호를 받아 답을 반환하는 함수의 의사 코드입니다.
int findit(int x) {
int a = int(log(x)/log(2));
if(x >= 2^a + 2^(a-1))
return 2^(a+1)
else
return 2^a
}
이것은 비 반복적 인 해결책입니다. – gogators
다음은 비트 솔루션입니다. 넥타이의 경우 2^N 및 2^(N + 1)의 렌털을 반환합니다. 이것은 log() 함수를 호출하는 것과 비교할 때 매우 빠릅니다.
let mask = (~0 >> 1) + 1
while (mask > value)
mask >> 1
return (mask & value == 0) ? mask : mask << 1
마지막 단락은 가능한 한 솔루션처럼 들립니다. 어느 부분에서 문제가 있습니까? –