我有一个无符号整数,我想把nibble压入其中。例如,如果我有值为1, 2, 3, 4, 5, 6, 7 & 8
的nibble,我希望能够将第一个nibble压入我的整数中,使:
0x10000000 (268435456)
在第二次push之后,我将有:
0x12000000 (301989888)
第三次push之后,我将有:
0x12300000 (305135616)
等等。有没有人有一个巧妙的主意,告诉我如何才能做到这一点?解决方案需要能够给定任何数字作为起点,并将其推到第一个可用的零上。因此,提供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;
}
调用如下:推动(,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;
}