作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有很多小块数据,我希望能够将它们放入一个更大的数据类型中。假设这是一个日期和时间。显而易见的方法是通过这样的位域。
struct dt
{
unsigned long minute :6;
unsigned long hour :5;
unsigned long day :5;
unsigned long month :4;
unsigned long year :12;
}stamp;
现在让我们假设这个东西是有序的,所以首先声明的东西比后面声明的东西具有更高的重要性,所以如果我用变量的第一个字母表示这些位,它看起来像:
mmmmmm|hhhhh|ddddd|mmmm|yyyyyyyyyyyy
最后,让我们假设我只是声明了一个无符号长整型并使用掩码和移位将其拆分以执行相同的操作。
unsigned long dateTime;
这是我的问题:
以下访问分钟、小时等的方法是否等同于计算机需要执行的操作?或者编译器/计算机对位字段使用了一些棘手的方法。
unsigned minutes = stamp.minutes;
//versus
unsigned minutes = ((dateTime & 0xf8000000)>>26;
和
unsigned hours = stamp.hours;
//versus
unsigned hours = ((dateTime & 0x07C00000)>>21;
等等
最佳答案
编译器生成的指令与您为访问这些位而显式编写的指令相同。所以不要指望使用位域会更快。
事实上,严格来说,对于位域,您无法控制它们在数据字中的位置(除非您的编译器为您提供一些额外的保证。我的意思是 C99 标准未定义任何)。手工做掩码,你至少可以将两个最常访问的字段放在系列中的第一个和最后一个,因为在这两个位置,隔离字段需要一个操作而不是两个操作。
关于c++ - 位域是否比掩码位和手动提取数据更有效(在计算上)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1484021/
我是一名优秀的程序员,十分优秀!