位操作-在C语言中将nibles压入整数堆栈



我有一个无符号整数,我想把nibble压入其中。例如,如果我有值为1, 2, 3, 4, 5, 6, 7 & 8的nibble,我希望能够将第一个nibble压入我的整数中,使:

0x10000000 (268435456)

在第二次push之后,我将有:

0x12000000 (301989888)

第三次push之后,我将有:

0x12300000 (305135616)

等等。有没有人有一个巧妙的主意,告诉我如何才能做到这一点?解决方案需要能够给定任何数字作为起点,并将其推到第一个可用的零上。因此,提供int 301989888作为起始点,并将3压入将得到305135616。从MSBLSB推送也是有用的。

我的歉意。这听起来像是一道考题。不是的,我只是想做个实验,但还没开始就卡住了!


勾选的答案是完美的!我把它稍微修改了一下(只是为了使它独立),我很高兴!

#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;
}

调用如下:推动(,x,咬,左);

我为格式道歉

您需要做两件事-检测下一口食物放在哪里,然后放在那里。为了检测,您可以屏蔽&转变:

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;

要向另一个方向推送,只需在nextLocation函数中改变for循环的方向:

for (i = 0; i <= 28; i += 4)

这是一个非常简单的例子,它可以满足您的需求。它"推动",但不是以自动的方式(如果这是您正在寻找的)。但这演示了概念(注意:我将每一小口合并成一个字节)。

#include <iostream>
using namespace std;
int main()
{
    int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78);
    cout<< hex << x << endl;
    return 0;
}

最新更新