从 C 中的多个值创建地址
Creating addresses from multiple values in C
我试图通过组合我拥有的多个无符号整数值在 C 中创建 32 位地址。这多个值很重要,需要全部存入1个32位地址。
例如:假设我有 unsigned int outer = 25
、unsigned int inner = 984
、unsigned int offset = 3241
。 outer int 在 32 位地址中有高 10 位,inner int 在 32 位地址中有 10 位中间位,offset 有剩余的 12 位来存储它的数字。
它看起来像:
OUTER | INNER | OFFSET
10 10 12 = 32 bit address
我知道,在这个例子中,外部和内部整数可以存储 0 - 2^10-1 的值,偏移量可以存储 0 - 2^12-1 的值,但是有了这些值我'我不确定如何根据它们在 32 位地址中可以拥有的位数将它们拆分,然后 forge/merge 将所有内容分解为整个地址。
不确定这是否符合您的目标,但如果您允许,您可以像这样制作一个结构
typedef struct {
union {
struct {
unsigned int offset : 12;
unsigned int outer : 10;
unsigned int inner : 10;
} bits;
unsigned int address;
}
} Address;
int main() {
Address a;
a.bits.offset = 3241;
a.bits.inner = 25;
a.bits.outer = 984;
printf("outer: %u\ninner: %u\noffset: %u\naddress: %08x", a.bits.outer,
a.bits.inner, a.bits.offset, a.address);
return 0;
}
输出
outer: 984
inner: 25
offset: 3241
address: 067d8ca9
尽管这取决于特定体系结构和编译器的字节顺序和位域处理。
根据@user3386109回答:
address = (outer << 22) | (inner << 12) | offset;
我试图通过组合我拥有的多个无符号整数值在 C 中创建 32 位地址。这多个值很重要,需要全部存入1个32位地址。
例如:假设我有 unsigned int outer = 25
、unsigned int inner = 984
、unsigned int offset = 3241
。 outer int 在 32 位地址中有高 10 位,inner int 在 32 位地址中有 10 位中间位,offset 有剩余的 12 位来存储它的数字。
它看起来像:
OUTER | INNER | OFFSET
10 10 12 = 32 bit address
我知道,在这个例子中,外部和内部整数可以存储 0 - 2^10-1 的值,偏移量可以存储 0 - 2^12-1 的值,但是有了这些值我'我不确定如何根据它们在 32 位地址中可以拥有的位数将它们拆分,然后 forge/merge 将所有内容分解为整个地址。
不确定这是否符合您的目标,但如果您允许,您可以像这样制作一个结构
typedef struct {
union {
struct {
unsigned int offset : 12;
unsigned int outer : 10;
unsigned int inner : 10;
} bits;
unsigned int address;
}
} Address;
int main() {
Address a;
a.bits.offset = 3241;
a.bits.inner = 25;
a.bits.outer = 984;
printf("outer: %u\ninner: %u\noffset: %u\naddress: %08x", a.bits.outer,
a.bits.inner, a.bits.offset, a.address);
return 0;
}
输出
outer: 984
inner: 25
offset: 3241
address: 067d8ca9
尽管这取决于特定体系结构和编译器的字节顺序和位域处理。
根据@user3386109回答:
address = (outer << 22) | (inner << 12) | offset;