2015-08-28 36 views
1

我的問題如下,我想正確地創建的setValue的功能(無符號整數&變種,INT K,無符號整型我,詮釋VAL)如何創建蒙

的VAR是路過參考值,int k是分區,i是分區的索引,val是我們傳入參考的值。現在,我的問題是如何創建一個面具。

下面是一個例子,我將使用8位而不是無符號整型的完整32位。

假設變種具有以下值: (1011)(1001),日K = 2 現在,假設我們希望把價值5進入指數1。所以我們需要VAR是: (1011) (0101)。因此,爲了達到那裏,我們需要做出以下邏輯組合。

VAR &面膜,面膜哪裏等於(1111)(0000) VAR =(1011)(0000) 然後我們做的,VAR = VAL | val

(1011)(000) (0000)(0101)|


(1011)(0101)我的問題是如何創建遮罩功能?這裏是哪裏我試圖創建它的代碼片段(順便說一下,我已經把我的VAR在起始位置爲0,我們進入該功能前):

bitSize = sizeof(unsigned int)*8; 

    partionSize = (bitSize/k); 
    shiftCount = partionSize*i; 

    mask = ~((1<< partionSize)-1) << shiftCount; 
    var = var & mask; 
    val = val << shiftCount; 
    var = var | val; 

的結果,如果我說我ķ = 2,並且i輸入的5和3以下的2個值是:

5:

shiftc到目前爲止計數爲:0 值掩碼的是:4294901760 在函數內的,VAR到目前爲止是5.

3:

目前爲止的移位次數是:16 mask的值是:0 var的值是196608.現在,二進制中的196608是110000000000000000,所以顯然它只移動了3 16次,並沒有正確地保存那裏5。其他方面應該是110000000000000101.謝謝你的協助。

編輯

我已經編輯面具部分看起來像現在這樣:

if(i == 0) 
{ 
    mask = ~((1<< partionSize)-1); 
} 
else 
{ 
    mask = ~(((1<< partionSize)-1) << shiftCount); 
} 

這似乎現在已經奏效。因爲現在,如果我輸入567,並且輸入346,那麼當我的k = 2時(如果有人想知道爲什麼總是2,我用兩個來讓我的生活更容易進行測試)。

var的最終值是22676023,這在二進制是:01010110100000001000110111 567是:01000110111 和346是:0101011010

這些值中的兩個似乎現今在我們的變量的內部。對更精通C++程序員的問題,這似乎是我的有效邏輯嗎?

+0

什麼是「var函數」? –

+0

var函數是我們的32位表示。實質上,它是我們放置我們的價值觀的變量。 – SomeStudent

+0

你看過'std :: bitset'嗎? –

回答

0

這就是例子位掩碼:可以說,我們有字母「A」到「d」

A = 1 //on 
B = 0 //off 
C = 1 
D = 1 

我們希望有一個面具,看起來像1011

我們先從mask = 1,並或將其與1 。

對於字母A:mask = mask | 1或者乾脆mask |= 1

對於字母b:我們什麼也不做,因爲它沒有設置,等等

mask = 1; 
a => mask |= 1  //(mask |= (1<<0)) 
//b => mask |= 2; //(mask |= (1<<1)) 
c => mask |= 4;  //(mask |= (1<<2)) 
d => mask |= 8;  //(mask |= (1<<3)) 

mask結果是1101。請注意,早些時候我說過我們想要1011,除了位被顛倒之外,它是一樣的。

void SetValue(unsigned int &mask, int index, int turn_on) 
{ 
    if (turn_on) 
     mask |= (1 << index); 
} 

int GetValue(unsigned int mask, int index) 
{ 
    return (mask >> index) & 1; 
} 

int main() 
{ 
    unsigned int mask = 1; 

    SetValue(mask, 0, 1);//A 
    SetValue(mask, 1, 0);//B 
    SetValue(mask, 2, 1);//C 
    SetValue(mask, 3, 1);//D 
    //up to SetValue(mask, 31, 1); 

    //mask is now equal to 13, or 1101 
    std::cout << mask << std::endl; 

    for (int i = 0; i < 4; i++) 
     std::cout << GetValue(mask, i); 

    //This prints 1011 (reverse of 1101). 
    //Again this has to do with the way we 
    //are printing the bits. 

    std::cout << "\n"; 
} 
+0

不知道這是你問的問題。讓我知道,如果這個答案不涉及你的問題,我會刪除它。 –

+0

我已經成功地弄明白了,但如果您要保留代碼,我將不勝感激。可以派上用場,我想看看我能否理解。快速的問題,不是XOR ^,|是正規的OR – SomeStudent

+0

我不知道爲什麼我說'異或',我的意思是'或',我改變了職位 –