ニブルのリストを含む配列があります。
{0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, ...}
上位ニブルを左シフトして下位ニブルと連結することにより、隣接するニブルを 1 バイトに結合したいと考えています。出力は次のようになります。
{0xab, 0xcd, 0xef, ...}
Cでこれをどのように達成できますか?
何かのようなもの
char *input, *output;
int i;
...
for(i=0; i<len; i+=2) {
output[i/2]=(input[i]<<4) | input[i+1];
}
入力の少なくとも半分の長さの配列として出力を提供し、上位ニブルは入力に設定されていません。
コード全体を書かなくても、ヒントは次のとおりです。
unsigned int Nibble1 = 0x0A;
unsigned int Nibble2 = 0x0B;
unsigned int Result = (Nibble1 << 4) | Nibble2; // Result = 0xAB
次に、入力配列を一度に 2 つの要素で反復処理し、出力配列に書き込むループを作成するだけです。
これが役立つことを願っています!
キックのために、2 番目の配列を使用せずに連結配列を生成するバージョンを次に示します。元の配列の前半を新しい値で上書きするだけです。
char * writePtr = originalArray;
char * readPtr = originalArray;
while (readPtr < (originalArray + arraySize))
{
*writePtr = (*readPtr << 4) | *(readPtr + 1);
readPtr += 2;
writePtr++;
}
これはあなたを助けるかもしれません、それはニブル(上/下)についての単純な芸術ではありません
このシステムは、2 進化 10 進数または BCD と呼ばれ、ニブルも占有します。BCD では、バイナリ パターン 1010 ~ 1111 は有効な BCD 番号を表さず、使用できません。
Decimal から BCD への変換は簡単です。10 進数の各桁を 1 バイトに割り当て、0 から 9 を 0000 0000 から 0000 1001 に変換するだけですが、10 進数を 2 進数に変換するときのように 2 で割り算を繰り返すことはできません。
これがどのように機能するか見てみましょう。10 進数 5,319 の BCD 値を決定します。10 進数には 4 桁あるため、BCD 番号には 4 バイトがあります。彼らです:
Final Number is -5319
Thousands Hundreds Tens Units
[5] [3] [1] [9]
0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1
コンピュータのストレージには最低 1 バイトが必要なので、各 BCD 番号の上位ニブルが無駄なストレージであることがわかります。BCD はまだ重み付けされた位置番号システムであるため、数学を実行することはできますが、正しい答えを得るには特別なテクニックを使用する必要があります。
パックされたBCD
ディスクと RAM のストレージは非常に貴重であるため、この無駄なストレージをなくしたいと考えています。これは、BCD 番号をパックすることで実現できます。パックされた BCD 数値では、各ニブルには小数点から始まる加重位置があります。したがって、BCD 番号 5319 を格納するために 4 バイトを必要とする代わりに、ストレージの半分である 2 バイトのみが必要になります。数値の上位バイトの上位ニブルには THOUSANDS 値が格納され、上位バイトの下位ニブルには HUNDREDS 値が格納されます。同様に、下位バイトは上位ニブルに TENS 値を格納し、下位ニブルに UNITS 桁を格納します。したがって、前の例は次のようになります。
Thousands - Hundreds Tens - Units
[53] [19]
0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1