gpt4 book ai didi

c++ - 如何制作面具

转载 作者:太空宇宙 更新时间:2023-11-04 13:28:55 31 4
gpt4 key购买 nike

我的问题如下,我正在尝试正确创建 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)变量 = (1011) (0000)然后我们做,var = val |值

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


(1011) (0101) 我的问题是如何创建 mask 功能?这是我尝试创建它的代码片段(顺便说一句,在我们进入函数之前,我已经将我的 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面具的值(value)是:4294901760在函数内部,var 到目前为止是 5。

3:

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

编辑

我已经将 mask 部分编辑成现在这样:

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

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

var的最终值为22676023,二进制为:01010110100000001000110111567是:01000110111而 346 是: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";
}

关于c++ - 如何制作面具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275305/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com