2009-03-30 6 views
3

비트 마스크를 배열 인덱스로 변환하는 간단한 방법이 있습니까?배열 대 비트 마스크

즉. 내가 열거

a = 0x01, 
b = 0x02, 
c = 0x04, 
d = 0x08, 
e = 0x10, 
etc 

있어 내가 배열에 releated 데이터를 저장할 경우, 간단한 방법은 내가 2 등으로 c를 1로 B, 0으로 변환 할 수 있도록 있는가?

많은 감사

+0

당신이 체크 아웃 할 수 있습니다 : http://referencesource.microsoft.com/#PresentationFramework/Framework/MS/Internal/UncommonValueTable.cs를 , 93b81e5e13cb3600 (서로 다른 크기의 어레이에 대해 비트 마스크를 유지함) – zahir

답변

6
r = ln base 2 
and programmatically, 

unsigned int v=yourEnumValue; 
unsigned r = 0; 
while (v >>= 1) 
{ 
    r++; 
} 

r is your answer 
+0

정확히 내가 생각하고 있었던 것. – jrockway

+0

누군가가 더 낮은 수준의 솔루션을 더 빨리 알고 있습니까? – clankill3r

1

난 당신이 요청하지만, 왜 그냥 대신 배열을지도를 사용하지 같은 간단한 해결책을 몰라?

마법 변환없이 작동해야합니다.

3

로그 n?

4

나는 이것이 당신이 요구하는 것이지 확신 할 수 없지만, 왜 2-base 로그를 취하지 않습니까?

+0

아, 자연 로그. 그게 내가 찾고 있던거야. 뭔가있을 거라고 생각했는데, 그게 뭔지 기억하지 못했습니다. 건배. – Dynite

+0

자연 로그가 아닙니다. 자연 로그는 로그베이스입니다. –

+0

예, 2 대신 1.3이 나온 경우 오류가 있음을 알았습니다. – Dynite

1

성병 : :지도 사용

#include <map> 

std::map <my_enum, my_datatype> m; 
m[ a ] = whatever; 
+0

나는 키를 저장하는 오버 헤드를 원하지 않기 때문에 맵을 사용하고 싶지 않다. – Dynite

+0

열거 형의 오버 헤드는 작을 것입니다. 색인을 계산하는 오버 헤드와 비교해야합니다. –