2012-08-03 2 views
3

하나의 32 비트 정수에 4 개의 값을 인코딩하는 클래스를 만들려고합니다. 지금까지는 아무것도 잃지 않고 모든 값을 저장하고 출력하지만 어떤 이유로 든 잘못된 순서로 출력합니다. 나는 연습으로이 일을하고,이 프로그램은 실제 프로그램에서 사용하지 않을32 비트 정수에서 4 개의 값을 인코딩하는 중

struct encoder { 
    uint32_t val; 

    encoder(uint32_t _val = 0) : val(_val) {} 

    uint32_t first(uint32_t v = 0) { 
     if (!v) return (val << (8*3)) >> (8*3); 

     val |= v; 
    } 

    uint32_t second(uint32_t v = 0) { 
     if (!v) return (val << (8*2)) >> (8*3); 

     encoder _backupval(val); 

     val = (val >> (8*1)); 
     val |= v; 
     val = (val << (8*1)); 
     val |= _backupval.first(); 
    } 

    uint32_t third(uint32_t v = 0) { 
     if (!v) return (val << (8*1)) >> (8*3); 

     encoder _backupval(val); 

     val = (val >> (8*2)); 
     val |= v; 
     //now restore 
     val = val << 8; 
     val |= _backupval.second(); 
     val = val << 8; 
     val |= _backupval.first(); 
    } 

    uint32_t fourth(uint32_t v = 0) { 
     if (!v) return (val << (8*0)) >> (8*3); 

     encoder _backupval(val); 

     val = (val >> (8*3)); 
     val |= v; 
     //now restore 
     val = val << 8; 
     val |= _backupval.second(); 
     val = val << 8; 
     val |= _backupval.first(); 
     val = val << 8; 
     val |= _backupval.third(); 
    } 
}; 

int main() { 
    encoder t; 
    t.first(6); 
    t.second(42); 
    t.third(212); 
    t.fourth(23); 

    cout << "first number: " << t.first() 
     << "\nsecond number: " << t.second() 
     << "\nthird number: " << t.third() 
     << "\nfourth number: " << t.fourth() << endl; 

} 

참고. 따라서 대체 방법을 제안하지 말고 결함을 지적하지 마십시오 (숫자의 크기가 256보다 크면 다른 정수 등을 손상시킬 수 있습니다)

+0

를 첫 번째() 두 번째 오버로드 않은 경우() ...? –

+1

디버깅 해 보셨습니까? 그것은 디버거가 처리 할 수있는 매우 간단한 문제처럼 보입니다. –

+1

또한 많은 return 문이 누락되었습니다. 추가 컴파일러 경고 활성화 – Zeta

답변

5

함수 순서를 혼합했습니다. fourth에 :

uint32_t fourth(uint32_t v = 0) { 
    if (!v) return (val << (8*0)) >> (8*3); 

    encoder _backupval(val); 

    val = (val >> (8*3)); 
    val |= v; 
    //now restore 
    val = val << 8; 
    val |= _backupval.second(); 
    val = val << 8; 
    val |= _backupval.first(); 
    val = val << 8; 
    val |= _backupval.third(); // this should be called first! 
} 

이 스크램블 반환 값 발생합니다. 간단하게 첫번째 thirdit will work 전화 :

uint32_t fourth(uint32_t v = 0) { 
    if (!v) return (val << (8*0)) >> (8*3); 

    encoder _backupval(val); 

    val = (val >> (8*3)); 
    val |= v; 
    //now restore 
    val = val << 8; 
    val |= _backupval.third(); 
    val = val << 8; 
    val |= _backupval.second(); 
    val = val << 8; 
    val |= _backupval.first(); 
} 
관련 문제