我有一个最终的32位整数
int32_t final;
它有这种格式
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
opcode rs rt rd shamt funct
我的操作码填充为0.我有rs rt和rd填充各自的整数。 shamt有它的价值,功能也很有用。我唯一的问题是,如何将这些加载到最终的int中?我知道它与<<<<<<<<运算符和逻辑如&和|。我有这个功能
unsigned mask(unsigned a, unsigned b)
{
unsigned r = 0;
unsigned i;
for (i=a; i<=b; i++)
r |= 1 << i;
return r;
}
创建一个掩码,该掩码可以用一个值来获得它的位a-b。我在这里走在正确的轨道上吗?
答案 0 :(得分:4)
虽然我发现Stargateur基于位域的解决方案非常优雅,但这里有一个基于“普通”左移的解决方案:请注意,数据类型是无符号的而不是签名的:
uint32_t final;
int opcode = 0;
int rs = 10;
int rt = 20;
int rd = 11;
int shamt = 12;
int funct = 11;
final = opcode;
final <<= 5; final |= rs;
final <<= 5; final |= rt;
final <<= 5 ;final |= rd;
final <<= 5; final |= shamt;
final <<= 6; final |= funct;
printf("0x%08x", final);
答案 1 :(得分:3)
您可以使用位字段:
union foo {
uint32_t header;
struct {
uint32_t opcode : 6,
rs : 5,
rt : 5,
rd : 5,
shamt : 5,
funct : 6;
};
};
示例:
int main(void)
{
union foo foo;
foo.opcode = 5;
foo.rs = 0;
foo.rt = 0;
foo.rd = 0;
foo.shamt = 0;
foo.funct = 5;
printf("%x\n", foo.header);
}
注意:这不处理字节序,这是实现行为https://stackoverflow.com/a/6044223/7076153。如果你想要便携,请按位使用。
答案 2 :(得分:0)
你可能有类似的东西:
Db.find({}, {skip: 20 * page, limit: 20});