2013-01-19 123 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); 

這將打印:

0x0000abcd 
0x0120abcd 
0x0000abcd 

這對我來說意味着(target & ~mask) | (source & mask)給出正確的結果(0x0120abcd),但這一結果沒有被分配回target(它仍然設置爲0x0000abcd)。任何想法我做錯了什麼?

+2

'target'具有16位類型。 –

+0

你應該爲這個值添加一個檢查,也是'unsigned int source,int offset,int bitCount',其中'target是一個16位的類型'看起來主要的錯誤 –

回答

4

來看類型爲target

uint16_t target 

這是隻有16位,但你嘗試着高於位掩碼。

+0

和解決方法是'mask'和'rightshift'應該是'uint16_t ** ** –

+1

@GrijeshChauhan如果需要16位值。如果需要32位值,則需要更改「target」類型。 –

+0

是的,因爲這個原因,我通常在MACRO做這種類型的東西。 –