2015-01-20 3 views
0

정수형 구조체를 비트 마스크로 변환하는 것이 가능합니까 (있는 경우). 각 정수에 대해 1 비트 (int가 0이면 0, 그렇지 않으면 1). 예를정수의 구조체를 비트 마스크로 변환

struct Int_List_t 
{ 
    uint64_t int1; 
    uint64_t int2; 
    uint64_t int3; 
    uint64_t int4; 
} int_list={10,0,5,0}; 



char int_mask = somefunction(int_list); 
//Would contain 1010 
       |||| 
       |||+-- int4 is 0 
       ||+--- int3 is not 0 
       |+---- int2 is 0 
       +----- int1 is not 0 
+1

예, 비트가 설정되어 있으면 각각을 차례로 테스트하고 해당 위치의 1을 OR로 테스트하십시오. 이 작업을 수행 할 기본 방법이 없습니다. – slugonamission

+0

예. @slugonamission이 말하는 것에 가서 의견을 말하도록 우리에게 돌아 가라. – Persixty

+0

정수를 배열에 저장할 수 있습니까? –

답변

2

를 들어 당신은 명시 적으로 그것을 할 수 있습니다 : 당신이 만약

template <size_t N> 
uint64_t mask(uint64_t (&vals)[N]) 
{ 
    uint64_t result = 0; 
    uint64_t mask = 1 << (N - 1); 
    for (size_t i = 0; i < N; ++i, mask >>= 1) { 
     result |= (vals[i] ? mask : 0); 
    } 
    return result; 
} 

'대신 구조체의 배열로 전달하는 경우

char mask(const Int_List_t& vals) 
{ 
    return (vals.int1 ? 0x8 : 0x0) | 
      (vals.int2 ? 0x4 : 0x0) | 
      (vals.int3 ? 0x2 : 0x0) | 
      (vals.int4 ? 0x1 : 0x0); 
} 

, 당신은 루프를 쓸 수 어떤 타입의 안전성을 완전히 우회하는 것으로 열어도 포인터를 객체로 재 해석하여 위 코드를 구현할 수도 있습니다. 반드시 추천 할 필요는 없습니다 :

template <typename T> 
uint64_t mask(const T& obj) 
{ 
    const uint64_t* p = reinterpret_cast<const uint64_t*>(&obj); 
    const uint64_t N = sizeof(T)/8; 

    uint64_t result = 0; 
    uint64_t mask = 1 << (N - 1); 
    for (size_t i = 0; i < N; ++i, ++p, mask >>= 1) { 
     result |= (*p ? mask : 0); 
    } 
    return result; 
} 
+0

나는 이것을 16 또는 심지어 32 비트 정수로 확장하기 때문에 내장 방식을 기대하고 있었다. –

+0

@NigelArmstrong 더 많은 옵션을 제공합니다. – Barry

+0

@ 배리 사과. 내가 말했듯이, 코드는 독자를 혼란시키는 역할을하는'for (;;)'선언에서 쉼표 연산자를 사용하는 두려운 나쁜 습관을 보여줍니다! ;) – Persixty

관련 문제