c++ - 解析一个位域参数,如何解析unsigned long中的 "discard"位?

标签 c++ c bit-manipulation parameter-passing bit-fields

首先,我想知道这是否可能:假设我有一个 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/

相关文章:

c++ - 会发生左值到右值的转换吗?

c - 指向将指向另一个函数的指针作为参数的函数的指针

c - 如何在C中比较整数和换行符?

c++ - 有没有可靠的方法在 double 中传递微秒时间?

c - K&R C 练习帮助

c++ - 返回对类成员容器的元素的引用

c++ - 为什么左折叠表达式不反转右折叠表达式的输出?

c++ - Qt Gridlayout 不重新对齐 GUI 元素

c - 为什么这个使用链表堆叠的程序不起作用?

c# - 如何解决这个位操作?