2

符号なし整数があり、それにニブルをプッシュしたいと考えています。たとえば、値1, 2, 3, 4, 5, 6, 7 & 8のニブルがある場合、最初のニブルを整数にプッシュして作成できるようにしたいと考えています。

0x10000000 (268435456)

2回目のプッシュの後、次のようになります。

0x12000000 (301989888)

3回目のプッシュの後、次のようになります。

0x12300000 (305135616)

などなど。どうすればこれを達成できるかについて、きちんとした狡猾なアイデアを持っている人はいますか? 解は、開始点として任意の数値を与え、最初に使用可能なゼロにプッシュできる必要があります。したがって、開始点として intを指定301989888して 3 を押すと、結果は になり305135616ます。MSBorからのプッシュ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;
}

次のように呼び出されます: push(&x,nibble,left);

フォーマットについてお詫び申し上げます。

4

2 に答える 2

5

あなたがしなければならない2つのことがあります-次のニブルを置く場所を検出し、それをそこに置きます。検出のために、マスクしてシフトすることができます:

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)
于 2013-02-27T18:32:24.297 に答える
1

これは、あなたが望むことをする非常に単純な例です。それは「プッシュ」しますが、自動化された方法ではありません (それがあなたが探しているものである場合)。しかし、これは概念を示しています (注: 各ニブルを 1 バイトに結合しました)。

#include <iostream>

using namespace std;

int main()
{
    int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78);
    cout<< hex << x << endl;
    return 0;
}
于 2013-02-27T18:34:56.717 に答える