如何使用其他整数的值加载32位整数

时间:2017-02-05 22:27:15

标签: c logic

我有一个最终的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。我在这里走在正确的轨道上吗?

3 个答案:

答案 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});