将Nibbles推入C中的整数堆栈

hea*_*ger 2 c bit-manipulation

我有一个无符号整数,我想将半字节推入其中.例如,如果我有值的半字节1, 2, 3, 4, 5, 6, 7 & 8,我希望能够将第一个半字节推入我的整数来制作:

0x10000000 (268435456)
Run Code Online (Sandbox Code Playgroud)

第二次推后,我会:

0x12000000 (301989888)
Run Code Online (Sandbox Code Playgroud)

第三次推动后,我会:

0x12300000 (305135616)
Run Code Online (Sandbox Code Playgroud)

等等.有没有人对我如何实现这一点有一个整洁而狡猾的想法?解决方案需要能够以任何数字作为起点并推送到第一个可用零点.所以提供int 301989888作为起点并推动3将导致305135616.推动MSB或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;
}
Run Code Online (Sandbox Code Playgroud)

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

我为格式化道歉.

Car*_*rum 5

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

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

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

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

int shiftAmount = nextLocation(x);
x |= nibble << shiftAmount;
Run Code Online (Sandbox Code Playgroud)

要推动另一个方向,您只需更改函数中for循环的方向nextLocation:

for (i = 0; i <= 28; i += 4)
Run Code Online (Sandbox Code Playgroud)