bit-fields相关内容
所以我最近遇到了这样的事情 unsigned char ch:7; 在结构内的 .我读了一点.显然,这些被称为位字段.它们用于设置char可以接收的数据的宽度.但是我们如何使用这些东西.例如,我知道我们可以将变量ch设置为一个字节 unsigned char ch = 0x61;cout
..
我有一个C ++应用程序,其中包括许多带有手动控制的位字段的结构,例如 #define FLAG1 0x0001#define FLAG2 0x0002#定义FLAG3 0x0004类MyClass{''未签名的标志;int IsFlag1Set(){返回标志&FLAG1;}void SetFlag1Set(){标志| = FLAG1;}void ResetFlag1(){标志& = 0xff
..
在C语言中使用位域时,我发现我所期望的差异与用于声明字段的实际类型无关. 我没有找到任何明确的解释.现在,可以确定问题所在,因此,即使没有明确的答复,该帖子对遇到相同问题的任何人也可能很有用.即使有人可以指出正式的解释,这种说法也很棒. 以下结构占用2个字节的内存. struct {char field0:1;//1位-位0char field1:2;//2位-位2降至1字符字段2
..
我有一个包含位域的结构: struct Foo { unsigned a : 16, b : 16; }; 我想知道是否可以在其位字段上使用聚合初始化.例如: struct Foo bar = {13, 42}; 我注意到,该可以在gcc 5.1和Visual Studio 2015中使用.这是标准批准的C和C ++初始化. 解决方案 从C ++ 14 [dcl
..
当我使用g ++将值分配给位字段时, -Wconversion会产生警告. 源文件: struct Foo { public: unsigned int x : 4; unsigned int y : 9; unsigned int z : 17; }; int main(int, char**) { int a = 12; Foo f;
..
我需要使用作用域枚举,以便可以将它们作为特定类型传递给我们的序列化程序。我为 Enum1 的枚举成员提供了显式的整数值。 我放置了两个与描述匹配的作用域枚举因此,以上枚举为位域 枚举类Enum1 { value1 = 0x0, value2 = 0x1, value3 = 0x2 }; 枚举类Enum2 { value1 = 0x0, value2, value3,
..
说,我有以下结构: typedef struct my_struct { unsigned long a; 无符号长b; char * c; unsigned int d1:1; unsigned int d2:4; unsigned int d3:4; unsigned int d4:23; } my_type,* p_type; 字段 d3
..
我今天遇到一个问题,我发现我字节中的位字段排序的方式取决于我的处理器的字节顺序。再看下一个例子: struct S { uint8_t a:3; uint8_t b:5; }; 此结构占用一个字节,但位布局取决于计算机: 小端:b4 b3 b2 b1 b0 a2 a1 a0 大端:a2 a1 a0 b4 b3 b2 b1 因
..
位域的字节序由实现定义。有没有一种方法可以在编译时通过宏或其他编译器标志检查gcc的位域字节序实际上是什么? 换句话说,给定类似以下内容: struct X { uint32_t a:8; uint32_t b:24; }; 我是否有办法在编译时知道 a 是 X 中的第一个字节还是最后一个字节? 解决方案 在Linux系统上,您可以检查 __
..
我们有数据通过串行(蓝牙)输入,该数据映射到特定的结构。结构的某些部分为亚字节大小,因此“显而易见的”解决方案是将传入数据映射到位字段。我无法解决的是机器或编译器的位字节序是否会影响它(这很难测试),我是否应该完全放弃位域。 例如,我们有一块1.5字节的数据,因此我们使用了以下结构: { uint8_t data1; // lsb uint8_t data2:4; // msb
..
这是C ++代码: void sign_extending(int x) { int r; //产生的符号扩展数在此处 struct {signed int x:5;} s; r = s.x = x; cout
..
我很早就知道C中有位域,偶尔我会用它们来定义密集的结构: typedef结构Message_s { unsigned int标志:1; unsigned int通道:4; unsigned int信号:11; }消息; 当我阅读开放源代码时,我经常会发现要存储的位掩码和移位操作并在手卷位字段中检索此类信息。这是如此普遍,以至于我认为作者并不了解位域语法,因此我
..
在下面的示例中,我希望 complex_t 的大小与 uint16_t 相同:2个字节,但是这是3个字节。 删除第二个联合(“ proximity_unsafe”)可将大小减小到2个字节,但我无法弄清楚打包规则的模型。 #include #include typedef union { uint16_t不安全; struct
..
在C ++ 11中可以做到 struct S {int i = 42;}; 每当忘记初始化成员i时,它的 都会默认初始化为42。我只是用 位域尝试了此操作 struct S {int i = 42:5;}; 并且正在获得 错误:在':'令牌之前应有';' 位域成员是否存在此功能,如果存在,如何我该使用它吗?
..
您可以使用enum类实现标准符合(如n3242草案的17.5.2.1.3中所述)类型的安全位掩码吗?按照我的阅读方式,如果类型T支持|,&,^,〜,| =,& =和^ =运算符,则它是位掩码,并且进一步可以执行if(l& r),其中l和r属于T类型。列表中缺少运算符!=和==,并且为了允许排序可能还想重载
..
C ++ 11中的9.6 / 3节非常清楚:“非常量引用不应绑定到位域。” 我知道禁止将引用直接绑定到位域是不可能的。但是,如果我声明这样的话, struct IPv4Header { std :: uint32_t version:4,//假定IPv4 Wikipedia条目正确 IHL:4, DSCP:6, ECN:2, totalLength:16; };
..
有没有一种简单的方法可以在不使用位域的情况下读取/写入字节半字节? 我将始终需要读取两个半字节,但需要分别写入每个半字节。 谢谢! 解决方案 使用掩码: char字节; 字节=(字节& 0xF0)| (半字节1& 0xF); //写低四重奏 byte =(byte& 0x0F)| ((nibble2& 0xF)
..
我正在阅读UDP上的一些MPEG传输流协议,并且其中包含一些时髦的位域(例如长度13).我正在使用"struct"库进行广泛的拆包,但是有一种简单的方式说“获取接下来的13位",而不必手动调整位操作吗?我想要类似C处理位字段的方式(不必还原为C). 建议? 解决方案 这是一个经常提出的问题.过去有 ASPN食谱条目. 并且有一个一个人希望从执行此操作的模块中看到的大量要求.
..
我正在为二进制格式编写解析器.这种二进制格式涉及不同的表,这些表又是二进制格式,通常包含不同的字段大小(其中的50-100之间). 这些结构中的大多数都将具有位域,并且在用C表示时将看起来像这样: struct myHeader { unsigned char fieldA : 3 unsigned char fieldB : 2; unsigned char fieldC
..
假设我有 struct A { signed char a:1; unsigned char b:1; }; 如果我有 A two, three; two.a = 2; two.b = 2; three.a = 3; three.b = 3; two在其字段中将包含0,而three将包含1.因此,这让我认为,将数字分配给单个位字段会得到最低有效位(2是10(二进
..