2013-02-27 86 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