如何创建一个蒙版

How to create a mask

本文关键字:一个 创建 何创建      更新时间:2023-10-16

我的问题如下,我试图正确创建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,并且我输入以下两个值5和3,结果是:

5:

shiftc count到目前为止是:0掩码取值为:4294901760在函数内部,var到目前为止是5。

3:

移位计数到目前为止是:16掩码取值为:0var的值为196608。现在,196608的二进制是110000000000000000,所以很明显它只移动了16次,甚至没有把5保存在那里。否则它应该是110000000000000101。谢谢你的帮助。

编辑

我已经编辑了遮罩部分,现在看起来像这样:

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

这似乎已经工作了。因为现在,如果我在k = 2时输入567和346(如果有人想知道为什么它总是2,我使用2使我的测试更容易)。

var的最终值为22676023,用二进制表示为:01010110100000001000110111567是:01000110111346是:0101011010

这两个值现在似乎都在我们的变量中。对那些更精通c++的程序员来说,问题是,这看起来像是我的逻辑吗?

这是位掩码的一个例子:假设我们有字母'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) )

掩码结果为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";
}
相关文章: