如何创建一个面具

时间:2015-08-28 16:05:47

标签: c++ bit-manipulation

我的问题如下,我正在尝试正确创建setValue的函数(unsigned int& var,int k,unsigned int i,int val)

var是按引用值传递,int k是分区,i是分区的索引,val是我们传入引用的值。现在,我的问题是如何创建一个掩码。

这是一个例子,我将使用8位而不是unsigned int的完整32位。

假设var具有以下值: (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;

结果,如果我说我的k = 2,我输入以下2个值5和3是:

5:

到目前为止,

shiftc计数是:0 面具的价值是:4294901760 在函数内部,var到目前为止为5。

3:

到目前为止的班次是:16 掩码值为:0 var的值是196608.现在,二进制的196608是110000000000000000,所以显然它只移动了3 16次,并且没有正确地打扰在那里保存5。其他明智的应该是110000000000000101。谢谢你的帮助。

修改

我已经编辑了蒙版部件,现在看起来像这样:

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

这似乎现在已经奏效了。因为现在,如果我输入567,而当我的k = 2时输入346(我使用两个来让我的生活更容易测试,如果有人想知道为什么它总是2)。

var的最终值是22676023,二进制是:01010110100000001000110111 567是:01000110111 346是:0101011010

这两个值现在似乎都出现在我们的变量中。对于更熟练的C ++程序员来说,这对我来说似乎是有效的逻辑吗?

1 个答案:

答案 0 :(得分:0)

这是位掩码的例子:假设我们有字母&#39; A&#39;到&#39; D&#39;

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) )

掩码结果为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";
}
相关问题