2013-01-19 5 views
0

C++에서 이상한 문제가 있습니다. 분명히 뭔가 빠져 있지만 확실하지는 않습니다.작업 결과가 변수에 할당되지 않았습니까?

이 함수의 목적은 변수의 일부 비트를 설정하는 것입니다. 내 테스트에서, 그것은 모두 작동하는 것처럼 보이지만 작업 결과가 변수에 다시 할당되지 않은 것처럼 보입니다.

uint16_t setBits(uint16_t target, unsigned int source, int offset, int bitCount) { 
    unsigned int mask = ~0; 
    mask = mask >> ((sizeof(mask) * 8) - bitCount); 
    int rightShift = (sizeof(mask) * 8 - bitCount - offset); 
    mask = mask << rightShift; 
    source = source << rightShift; 
    printHex(target); 
    printHex((target & ~mask) | (source & mask)); 
    target = (target & ~mask) | (source & mask); 
    printHex(target); 
    return target; 
} 

uint16_t group; 
group = 0xabcd; 
unsigned int source = 0x12; 
group = setBits(group, source, 4, 8); 

이 인쇄 것입니다 : 나를 위해 (target & ~mask) | (source & mask)가 올바른 결과 (0x0120abcd), 그러나이 결과는 (여전히 0x0000abcd로 설정되어있는) target에 다시 할당되지 않은를 제공한다는 것을 의미

0x0000abcd 
0x0120abcd 
0x0000abcd 

합니다. 내가 뭘 잘못하고 있는거야? target의 형태에서

+2

'target '은 16 비트 유형입니다. –

+0

당신은'unsigned int source, int offset, int bitCount'에 대해서이 값의 체크를 덧붙여 야합니다.'target은 16 비트 타입입니다. '는 주된 실수는 –

답변

4

봐 :

uint16_t target 

그것은 단지 16 비트,하지만 그보다 더 높은 비트 마스크하려고합니다.

+0

이고 솔루션은'mask'이고'rightshift'는'uint16_t '**? ** –

+1

@GrijeshChauhan _If_ 16 비트 값이 필요합니다. 32 비트 값이 필요하다면'target '의 타입을 변경해야합니다. –

+0

예, 이런 이유로 저는 일반적으로 MACRO에서 이런 종류의 작업을 수행합니다. –

관련 문제