2

我有一个无符号整数,我想将半字节推入其中。例如,如果我有带有 values 的半字节1, 2, 3, 4, 5, 6, 7 & 8,我希望能够将第一个半字节推入我的整数中以生成:

0x10000000 (268435456)

第二次推送后,我将拥有:

0x12000000 (301989888)

第三次推送后,我将拥有:

0x12300000 (305135616)

等等。有没有人对我如何实现这一目标有一个巧妙而巧妙的想法?解决方案需要能够以任意数字作为起点,并推到第一个可用的零。因此,提供 int301989888作为起点并推动 3 将导致305135616. MSB从or推送LSB也很有用。

我很抱歉。听起来像是考试题。不是——我只是想尝试一个实验,但在我开始之前就被卡住了!


打勾的答案是完美的!我对它进行了如下轻微修改(只是为了让它自成一体),我很高兴!

#define left 0
#define right 1

void push(unsigned* number, int nibble,int direction){
  int i, shift;
  if (direction){
    for (i = 28; i >= 0; i -= 4){
  if (!(*number & (0xfU << i)))
    shift = i;
}
  }
  else{
for (i = 0; i <= 28; i += 4){
  if (!(*number & (0xfU << i)))
    shift = i;
}
  }
  *number|=nibble<<shift;
}

调用如下:push(&x,nibble,left);

我为格式化道歉。

4

2 回答 2

5

您需要做两件事 - 检测下一个半字节的位置,然后将其放在那里。对于检测,您可以屏蔽和移位:

int nextLocation(uint32_t x)
{
   int i;
   for (i = 28; i >= 0; i -= 4)
   {
       if (!(x & (0xfU << i)))
           return i;
   }
   return -1;
}

此函数将返回“推动”下一个半字节(或者-1如果您的整数已经满)所需的升档量。

然后,您需要输入新值(假设这x是您要推送nibble的值并且是您要推送的值):

int shiftAmount = nextLocation(x);
x |= nibble << shiftAmount;

要推动另一个方向,您可以for在函数中更改循环的方向nextLocation

for (i = 0; i <= 28; i += 4)
于 2013-02-27T18:32:24.297 回答
1

这是一个非常简单的示例,可以满足您的要求。它“推动”,但不是以自动化的方式(如果这是您正在寻找的)。但这证明了这个概念(注意:我将每个半字节组合成一个字节)。

#include <iostream>

using namespace std;

int main()
{
    int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78);
    cout<< hex << x << endl;
    return 0;
}
于 2013-02-27T18:34:56.717 回答