是否有一种简单的方法可以在不使用位字段的情况下读取/写入字节中的半字节?我总是需要读两个半字节,但需要单独写每个半字节.
谢谢!
首先,我不关心可移植性,并且可以安全地假设字节顺序不会改变.假设我读取了硬件寄存器值,我想将该寄存器值覆盖在位域上,这样我就可以参考寄存器中的各个字段而不使用位掩码.
编辑:修复了GMan指出的问题,并调整了代码,以便将来读者更清楚.
请参阅: Anders K.和Michael J的答案,以获得更有说服力的解决方案.
#include <iostream>
/// \class HardwareRegister
/// Abstracts out bitfields in a hardware register.
/// \warning This is non-portable code.
class HardwareRegister
{
public:
/// Constructor.
/// \param[in] registerValue - the value of the entire register. The
/// value will be overlayed onto the bitfields
/// defined in this class.
HardwareRegister(unsigned long registerValue = 0)
{
/// Lots of casting to get registerValue to overlay on top of the
/// bitfields
*this = *(reinterpret_cast<HardwareRegister*>(®isterValue)); …Run Code Online (Sandbox Code Playgroud) 我正在实施无线电标准,并在结构和内存大小方面遇到了问题.在下面的例子中,我需要这个结构位于单个字节的内存中(按照无线电标准),但它目前给我2个字节的大小.经过多次挖掘后,我明白这是因为联盟的"大小"是字节而不是3位......但是还没有解决这个问题.我看过:
但似乎都没有给我一个解决方案.
有任何想法吗?
谢谢!
#ifdef WIN32
#pragma pack(push)
#pragma pack(1)
#endif
typedef struct three_bit_struct
{
unsigned char bit_a : 1;
unsigned char bit_b : 1;
unsigned char bit_c : 1;
}three_bit_struct_T;
typedef union
{
three_bit_struct_T three_bit_struct;
unsigned char another_three_bits : 3;
}weird_union_T;
typedef struct
{
weird_union_T problem_union;
unsigned char another_bit : 1;
unsigned char reserved : 4;
}my_structure_T;
int _tmain(int argc, _TCHAR* argv[])
{
int size;
size = sizeof(my_structure_T);
return 0;
}
#ifdef WIN32
#pragma pack(pop) …Run Code Online (Sandbox Code Playgroud) 可能重复:
这个C++代码是什么意思?
在以下C++代码中
# include <stdio.h>
int main()
{
struct clap
{
int i:2;
int j:2;
int k:3;
}x={1,2,3};
printf("%d %d %d",x.i,x.j,x.k);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在运行以下代码时,我得到输出1 -2 3
请参考上面的代码解释":"运算符的含义,以及这种奇怪输出的原因;
我需要一个2位数组,我根本不关心保存内存,但我关心的是最小化缓存未命中和最大化缓存效率.使用bool数组将使用4倍以上的内存,这意味着对于缓存中的每个可用数据块,将有3个未使用.从技术上讲,如果我使用位域,我可以获得3倍更好的缓存一致性.
计划是将其实现为一个字节数组,分为4个相等的位域,并使用div函数来获取整数商和余数,可能在一个时钟中,并使用它们来访问正确的索引和右边位域.
我需要的数组大约是10000个元素,因此它将产生明显更密集的打包数据,使用2个实际位将允许整个数组适合L1缓存,而使用字节数组则不可能.
所以我的问题是,是否有人可以告诉我这是否是一个以性能为导向的任务的好主意,所以我知道是否值得出去实施2位阵列?当然,最好的了解方法是分析,但事先提供的任何信息都可能有用,我们将不胜感激.
我有以下C代码.
struct values{
int a:3;
int b:3;
int c:2;
};
void main(){
struct values v={2,-6,5};
printf("%d %d %d",v.a,v.b,v.c);
}
Run Code Online (Sandbox Code Playgroud)
当我执行代码时,我得到以下输出:
2 2 1.
Run Code Online (Sandbox Code Playgroud)
但输出应该是2 -6 5,对吧?
如果我错了请解释.
我正在尝试计算这个结构的字节大小,并有几个问题
struct stc {
int a;
int b;
char c;
union stc2 {
long a0;
int a1;
int a2;
};
char arr[10];
int z:2;
};
Run Code Online (Sandbox Code Playgroud)
我正在用这种方式检查大小:
int main(void) {
printf("%zu\n", sizeof(struct stc));
}
Run Code Online (Sandbox Code Playgroud)
并编译:
gcc -std=c99 -m32 -Wall -Wextra test.c
这是gcc 4.9,我在64位计算机上,但首先要尝试32位值,所以-m32.现在,结果是20,但我不知道为什么会这样.这就是我的计算方式.
struct stc {
int a; // +4 = 4
int b; // +4 = 8
char c; // +1 but next is long, so +4 (alignment) = 12
union stc2 {
long a0; // +4 = …Run Code Online (Sandbox Code Playgroud) 结构或联合的成员可以具有除可变修改类型之外的任何完整对象类型.另外,可以声明成员由指定数量的位组成(包括符号位,如果有的话).这样的成员称为位域; 124)其宽度前面有冒号.
我是否正确理解这表明单个成员struct { int bit:1; }可能是一个符号位?
如果是这种情况,则遵循这样的位字段可能存储在某些实现上的唯一值是,0并且-0其中-0可能与0一旦存储或陷阱表示无法区分.
是否有任何实际的实现只能将一个值分配给这样的位域?
我有一个包含位字段的结构:
struct Foo {
unsigned a : 16, b : 16;
};
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以在它的位字段上使用聚合初始化.例如:
struct Foo bar = {13, 42};
Run Code Online (Sandbox Code Playgroud)
我注意到这在gcc 5.1和Visual Studio 2015中都有效.我只想要证明这是C和C++的标准批准初始化.
我已经阅读了多个有关位字段的类似主题,但是我对它的理解不够,因此我无法使用它。这是我的问题。我有这个struct R:
struct R{
unsigned int opcode: 6;
unsigned int rs: 5;
unsigned int rt: 5;
unsigned int rd: 5;
unsigned int shamt: 5;
unsigned int funct: 6;
};
Run Code Online (Sandbox Code Playgroud)
我使用位字段来定义我的结构是32位数据。对于那些想知道的人,此结构表示R类型的MIPS指令。
我想要的是将数据写入一个名为的文件中result,为此我使用了以下代码:
struct R test = {32,0,11,21,19,0}
FILE *fp = fopen("./result", "rb");
fwrite(&test,sizeof(test),1,result);
Run Code Online (Sandbox Code Playgroud)
使用此代码,如果我运行到控制台xxd -b result,则希望看到以下内容:
00000000: 00100000 01011000 01110101 00000010
Run Code Online (Sandbox Code Playgroud)
相反,我得到
00000000: 00100000 10100000 01110011 00000001
Run Code Online (Sandbox Code Playgroud)
我想问题是fwrite,但我不太了解。
这是一项作业,所以我考虑了一个替代方案:
char sequence[32]非常索引模拟1位的数组。struct R{
char opcode[6];
char rs[5];
char …Run Code Online (Sandbox Code Playgroud)