如何创建一个蒙版
How to create a mask
我的问题如下,我试图正确创建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";
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何创建一个空的全局类并在启动时实例化它
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在c++中为double类型的数组创建一个unique_ptr
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何从这些语句中的每一个创建不同的函数?
- 给定一个创建的带有货物的链表,我需要使用函数检查实际序列或"train"是否有效
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- 如何实现一个创建新对象并返回对它的引用的C++方法
- 如何成功创建一个创建对象并返回指向该对象的指针的函数