我有一个无符号整数,我想将半字节推入其中。例如,如果我有值为1, 2, 3, 4, 5, 6, 7 & 8
的半字节,我希望能够将第一个半字节推入我的整数中来制作:
0x10000000 (268435456)
第二次推后,我会:
0x12000000 (301989888)
第三次推后,我会:
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,半字节,左);
我对格式化道歉。
答案 0 :(得分:5)
您需要做两件事 - 检测下一个半字节的位置,然后将其放在那里。对于检测,你可以掩盖&amp;移:
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)
答案 1 :(得分:1)
这是一个非常简单的例子,可以满足您的需求。它“推”,但不是以自动方式(如果这是你正在寻找的)。但这证明了这个概念(注意:我将每个半字节组合成一个字节)。
#include <iostream>
using namespace std;
int main()
{
int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78);
cout<< hex << x << endl;
return 0;
}