2016-07-11 2 views
2

저는 9 개의 요소와 정수 배열을 가지고 있습니다. 정수 및 비트 마스킹을 사용하여 배열의 요소가 유효한지 여부에 대한 정보를 저장하려고합니다.n 번째 배열 요소를 얻는 간단한 방법은 n^2입니다.

내 질문은 : Log2() math.h를 사용하여 내 비트 마스크에서 배열 요소 번호를 가져 오는 것보다 간단한 방법이 있습니까? 예를 들어, 비트 마스크를 사용하여 foo2,foo4foo5mValue에 저장합니다. 그러면 두 번째 비트 인 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' 
} 
+0

[이 질문에 대한 답변] (http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) – mvidelgauz

답변

2

일반적인 관용구이다 log2에/플로트) 전화 :

int bit_pos=0; 
unsigned int value = ...; // your input 

while (value>1) { 
    value >>= 1; 
    bit_pos++; 
} 

bit_pos 지금 value에서 가장 높은 설정 비트의 위치를 ​​포함 value=2^n 인 경우 n이됩니다.

더 우아하고 빠른 방법이 있습니다. (인텔이나 다른 회사들에게 이것을 위해 레벨러 명령어를 만들지는 않았지만) 필자는 필요할 경우에만 이러한 것들을 더욱 최적화 할 것입니다.

+0

감사합니다! 그러나 이것이 'n'이라면 이것도 작동 할 것입니다. 그러나 내가 가진 것은'2^n'입니다. – tzippy

+0

nVal'2^n' 만 가질 때 (그러나 왜?) 보통 의미가 없으므로 대개 'n'을 대신 사용하는 것이 쉽습니다. 그렇지 않으면 루프의 비트 대부분을 다시 스캔하게됩니다. 당신은 컴파일러에 비트 카운트 함수가 있는지 확인할 수 있습니다. 예를 들어 gcc에는'int __builtin_popcount (unsigned int x)'가 있습니다. 따라서'n = __builtin_popcount (nVal-1);'@tzippy – Ped7g

1
if (mValue & (1<<n)) { 
    printf("%d\n", bar[n]); 
} 

나는 조금 열중하고 있지만 꽤 효과적일까요?

관련 문제