通俗地说,位域是啥?

Posted

技术标签:

【中文标题】通俗地说,位域是啥?【英文标题】:What is a bit field in layman's terms?通俗地说,位域是什么? 【发布时间】:2013-11-06 18:36:10 【问题描述】:

谁能告诉我外行的位域是什么?我正在上一门调试 php 课程,讲师经常使用该术语。这是在 PHP 错误报告的上下文中。

这是抄录中的一段话:

错误报告用整数设置错误报告级别 通常通过一个命名常量来表示一个位域。经过 默认情况下,PHP 报告除 E_NOTICE 和之前版本之外的所有内容 到 PHP 5.4,也不包括 E_STRICT。

我认为作为一名有抱负的程序员,了解我的行业术语很重要 :)

感谢您的帮助!

注意:我已经尝试过***...

【问题讨论】:

en.wikipedia.org/wiki/Bit_field 【参考方案1】:

我们需要从一点点开始。位将采用两个值——零或一。按照惯例,零也称为假,而一则称为真。

一个位域是几个位。

在这里,我将通过描述两种常见的位组织——字符和单词来离题。

在过去,PC 出现的字符是 8 位,而单词是 32 位。今天,字正在转向 64 位字。字符正在移动到 16 位。

表示位域的整数

我不知道 PHP 是如何划分整数的,但这是思路。基本上,如果您在位级别查看整数,您会发现一些有意义的模式。

您需要了解十六进制和 2 的幂才能更清楚地理解这一点。

a 32 bit integer would be
0000 0000  0000 0000  0000 0000  0000 0000  

Putting in two bit fields...
0000 0000  0000 0000  0000 0000  AAAA BBBB 

从位中查看整数,您会发现两个字段 A 和 B,每个 4 位宽。

AAAA 的十六进制值可能是 1100 或 C BBBB 的十六进制值可能是 0111 或 7。

整数的十六进制值为 C7 或十进制值为 199。

因此,整数 199 与位字段一起查看时会有不同的外观。

罗伯特

【讨论】:

谢谢,您和@Nishith Jain M R 的回答都很有帮助,但我接受了您的回答,因为它更容易理解。问题是我不是低级程序员,所以这些概念对我来说绝对是新领域。【参考方案2】: 位字段是由指定位数组成的变量。 位域可以是结构或联合的成员。

位域被解释为整数类型。

语法:

struct structName

  dataType identifierName1: numberOfBits;
  dataType identifierName2: numberOfBits;
  ...
;

“numberOfBits”必须是非负整数值。

位域没有地址。对于位域数组,指向位域的指针和返回位域的函数是不可能的。

地址运算符 (&) 不能应用于位域

未命名的位域可以存在,但不能被引用。

运行时未命名位字段的内容是不可预测的。它们可以用作“虚拟”字段,用于对齐目的。

宽度指定为 0 的未命名位字段保证声明列表中跟随它的成员的存储开始于 int 边界。

typedef struct bitField

  unsigned x  : 3;  // 0 to +7   (3 bits)
  signed      : 2;  // No name - 2 Bits of padding 
  signed y    : 6;  // -32 t0 +31  (6 bits)
  unsigned    : 0;  // Force alignment to next boundary.
  unsigned z  : 1;  // 0 or 1   
 Temp;

【讨论】:

这是一个好的开始,谢谢!它们是用来做什么的?你能提供一个实际使用的例子吗?我理解这些概念,但我不知道如何使用这些数据进行思考。

以上是关于通俗地说,位域是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥位字节序是位域中的一个问题?

位域使用 · 今天又是美好的一天!

定义的变量的位域就是4是啥意思?

c里面冒号的意思,C语言中的冒号(:是啥意思

C位域操作

C/C++ 位域知识小结