2016-10-24 5 views
-1
예를 들어

,C/C++에서 '그 외 모든 비트'를 부분 집합하는 가장 쉬운 방법은 무엇입니까?

unsigned char a = 0b11010010; 

나는 다른 모든 비트에 대한 a을 부분 집합, 즉 4 비트의 값을 만들기 위해 함께 넣어, 0, 2, 4, 6 일 위치를 복용하고 0로를 배치 할 , 1, 2, 3 rd 위치.

다음과 같이 하드 코딩 할 수 있습니다

unsigned char subset = (a & (1 << 0))  | 
         ((a & (1 << 2)) >> 1) | 
         ((a & (1 << 4)) >> 2) | 
         ((a & (1 << 6)) >> 3); 

내가이 일을 더 쉽게, 간단하거나 우아한 방법이 있는지 알고 싶습니다.

+2

제 3 회? 너? 이상하게 보입니다 :-) – paxdiablo

+0

아, 네 ... 고마워요. 고쳤다. – Jeon

+0

음, 문제 없습니다. 그러나 나는 일종의 '바퀴의 재발 명'을하고 있는지 또는 다소 비효율적인지 (가독성이나 성능면에서) 여부를 알고 싶다. – Jeon

답변

1

코드는 의도가 가장 명확한 표현이며 가능한 모든 컴파일러 최적화에 가장 적합합니다 (함수로는 constexpr이라고 선언 할 수 있음). 매직 넘버로 영리한 마스킹과 곱셈을 할 수는 있습니다.하지만 그 수는 얻을 수 없기 때문에 그 수보다 더 많은 이득을 얻습니다.

0

확실히 우아하지 않고 방금 작성한 것으로 확장되지만 템플릿을 싫어할 수는 없습니까?

template <int pos = 0> 
struct altbit{ 
    static char compute(char a) { 
    return ((a & (1 << (2*pos))) >> pos) | altbit<pos+1>::compute(a); 
    } 
}; 

template <> 
struct altbit<4> { 
    static char compute (char a) { 
    return 0; 
    } 
}; 

사용법 : altbit<>::compute(a)

+0

'constexpr' 누구? – IInspectable

0

비트 연산이 더 우아 할 수 std::bitset 사용 :

#include <iostream> 
#include <bitset> 

int main() 
{ 
    std::bitset<8> b1(0b11010010); 
    std::bitset<4> b2; 
    for (int i = 0; i < 4; ++i) 
    { 
     b2[i] = b1[i*2]; 
    } 
    std::cout << std::hex << "in: " << b1 << ", out: " << b2 << "\n"; 
} 
관련 문제