首先,我想知道这是否可能:假设我有一个 unsigned long,其中包含一些 abritrary unsigned shorts,它可能在也可能不在数字中。例如:
unsigned short int id1 = 3456,
id2 = 30998;
unsigned long long bitfld = id1|id2;
其他2个字段可以假设为0吗? OR 是正确的操作吗?之后假设我将 bitfld 作为参数传递:
void dostuff (unsigned long long bf)
{
//pseudo code
if( the first field exists in bf)
get first field;
if( the second field exists in bf)
get second field;
//etc...
}
我想我必须轮询位域的前 16 位并检查它们,然后递归地轮询它们,验证它们并在它们大于 0 时存储它们。但我不确定该怎么做,位shifting 只是左移或右移,因此,它只是除以或乘以右?
抱歉撞到了。感谢大家的回答,但我最终使用了一种更简单、更有效的方法,即内部结构。你看,我本可以使用字符串轻松完成此操作,但我的目的是让代码的用户透明,可以说易于编程。 我创建了一个内部结构来保存我的值,然后创建了一个公共(public)方法来创建和返回这样的结构,因此它易于使用且解析速度更快(尽管它有在堆栈中分配一个(尽管很小)结构的开销,它位域解决方案没有,但唉)。
谢谢大家的回答。
最佳答案
short int
是 2 个字节长,但是 long long
是 8 个字节,所以你有某种长度不匹配;
你可能是这个意思:
unsigned long long bitfld = id1|(id2<<16);
您可以检查是否有一个字段被 AND
占用:
void dostuff (unsigned long long bf)
{
//pseudo code
if(bf & 0xFFFF)
return bf & 0xFFFF;
if(bf & 0xFF00)
return (bf & 0xFFFF0000) >> 32;
//etc...
}
关于c++ - 解析一个位域参数,如何解析unsigned long中的 "discard"位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2024650/