我的问题如下,我正在尝试正确创建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 ++程序员来说,这对我来说似乎是有效的逻辑吗?
答案 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";
}