저는 9 개의 요소와 정수 배열을 가지고 있습니다. 정수 및 비트 마스킹을 사용하여 배열의 요소가 유효한지 여부에 대한 정보를 저장하려고합니다.n 번째 배열 요소를 얻는 간단한 방법은 n^2입니다.
내 질문은 : Log2() math.h를 사용하여 내 비트 마스크에서 배열 요소 번호를 가져 오는 것보다 간단한 방법이 있습니까? 예를 들어, 비트 마스크를 사용하여 foo2,
foo4
및 foo5
을 mValue
에 저장합니다. 그러면 두 번째 비트 인 foo2 = 2
위치에 배열 요소를 가져오고 두 번째 배열 요소 인 34
을 가져 오려고합니다. 내가 생각할 수있는 유일한 방법은 log2(n)
입니다. bitshifting을 사용하는 것이 더 간단한가요?
간단하게 말해서, 나는이 작업을 수행 할 수 :
1의 정수 mValue
세트의 n 번째 비트인가? 그럼 배열 bar
배열의 n 번째 요소를 가져 오십시오. 고가 (더블 그러나 당신이 가지고있는 유일한 것은 진정으로 (그리고 당신 주위에 당신의 논리를 켤 수 없습니다) 2^n
경우, 당신은 여전히 피할 수 :
if (mValue & (1<<n)) {
return bar[n];
}
편집 :
#include <math.h>
const int foo1 = 1;
const int foo2 = 2;
const int foo3 = 4;
const int foo4 = 8;
const int foo5 = 16;
int bar[9] = {23,34,82,8,7,0,23,19,20};
int mValue;
void SetValue(int nVal)
{
mValue = nVal;
}
bool IsElementValid(int nVal)
{
return mValue & nVal;
}
int main()
{
SetValue(foo2 | foo4 | foo5);
IsElementValid(foo4); //true
IsElementValid(foo5); //true
IsElementValid(foo1); //false
//access array element 1 with value foo2 (2)
if(IsElementValid(foo2))
printf("%d\n", bar[log2(foo2)]); // output: '34'
}
[이 질문에 대한 답변] (http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) – mvidelgauz