gpt4 book ai didi

Go:位域和位打包

转载 作者:IT王子 更新时间:2023-10-29 01:07:29 26 4
gpt4 key购买 nike

C 语言的位域提供了一种在结构中定义任意宽度字段的相当方便的方法(暂时不要考虑可移植性问题。)例如,这是一个带有几个字段和一个“标志”的简单结构:

#pragma pack(push,1)
struct my_chunk{

unsigned short fieldA: 16;
unsigned short fieldB: 15;
unsigned short fieldC: 1;
};
#pragma pop()

添加#pragma 语句将此结构打包成一个 32 位字(确保 my_chunk 指针的指针操作对齐,例如,同时节省空间)。

访问每个字段在语法上非常好:

struct my_chunk aChunk;
aChunk.fieldA = 3;
aChunk.fieldB = 2;
aChunk.fieldC = 1;

在没有语言帮助的情况下执行此操作的另一种方法相当丑陋,并且几乎转变成汇编程序。例如一种解决方案是为您要访问的每个字段设置位移宏:

#define FIELD_A  0xFF00
#define FIELD_B 0x00FE
#define FIELD_C 0x0001

#define get_field(p, f) ((*p)&f)
#define set_field(p, f, v) (*p) = (v<<f) + (*p)&(~f)

...
set_field(&my_chunk, FIELD_A, 12345);

.. 或大致类似的东西(更正式的,看看 this )

所以问题是,如果我想在 go 中“执行”位域,这样做的最佳做法是什么?

最佳答案

"There are no current plans for struct bitfields in Go."

您可以编写一个 Go 包来执行此操作;不需要汇编程序。

关于Go:位域和位打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com