2013-02-27 84 views
2

我有一个无符号整数,我想将半字节推入它。举例来说,如果我有一个价值1, 2, 3, 4, 5, 6, 7 & 8啃,我希望能够到第一四位推入我的整数,其用于:将半字节推入C中的整数堆栈

0x10000000 (268435456) 

第二推后,我将有:

0x12000000 (301989888) 

第三次推后,我将有:

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,半字节,左);

我很抱歉格式化。

+0

你的意思是从'301989888'开始并按'3',对吧? – 2013-02-27 18:36:40

+0

绝对正确。你认为我可以通过这个故意作为故意的错误,只是为了看看有没有人关注?感谢你如此鹰眼。 – headbanger 2013-02-27 20:08:57

回答

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; 

推另一个方向,你可以改变在nextLocation功能for循环的方向:

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

谢谢 - 我非常感谢你。事实上,你已经度过了我的一天! – headbanger 2013-02-27 20:10:44

1

下面是一个简单的过度例子你想要做什么。它“推动”,但不是以一种自动化的方式(如果这就是你想要的)。但是这表明了这个概念(注意:我将每个半字节组合成一个字节)。

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78); 
    cout<< hex << x << endl; 
    return 0; 
} 
+0

感谢您的建议。我可以做那部分 - 我需要额外的一英里 - 由卡尔提供 – headbanger 2013-02-27 20:10:13