1

4 つのデータをバイト配列にコピーする必要がありますが、データを特定のビット位置にコピーする必要があります。

これが例です。

私の4つのデータは以下の通りです。バイナリで詳細に説明されているように、左から右に順番に表示され、見やすいようにハイフンで区切られています。

  • 1341 = 0x05D3 (常に 14 ビットに切り捨て)
  • 0001 = 0x0001 (常に 14 ビットに切り捨て)
  • 987654 = 0x0F1206 (常に 20 ビットに切り捨てられます)
  • 20110411 = 0x0132DC4B (常に 25 ビットに切り捨てられます)

必要な出力を完了しました:

0C 53 D0 00 7C 48 1A 65 B8 97

バイナリでは、最初と最後のビットはパリティです。

1-00010100111101-00000000000001-11110001001000000110-1001100101101110001001011-1

私はこれを行う方法に途方に暮れています。どういうわけかビットシフトを使用することは可能ですか?

4

2 に答える 2

3

std::bitsetを使用して数字を表すことをお勧めします。以下はあなたの問題を解決しませんが、あなたが望む場所にたどり着くのに役立つかどうか疑問に思いますか?

#include<iostream>
#include<iomanip>
#include<bitset>

struct Data {
  std::bitset<14> d1;
  std::bitset<14> d2;
  std::bitset<20> d3;
  std::bitset<25> d4;
  Data(unsigned int d1, unsigned int d2, unsigned int d3, unsigned int d4)
      : d1(d1),
        d2(d2),
        d3(d3),
        d4(d4) {}  
};

std::ostream& operator<<(std::ostream& os, const Data& data) {
  os<<data.d1<<"-"
    <<data.d2<<"-"
    <<data.d3<<"-"
    <<data.d4;
  return os;      
}

int main() {
  Data d(1341, 1, 987654, 20110411);
  std::cout<<d<<std::endl;
}

出力:

00010100111101-00000000000001-11110001001000000110-1001100101101110001001011
于 2013-05-01T22:22:52.127 に答える
0

すべてのデータを保持するのに十分な大きさの配列を割り当てることができます。

unsigned char buffer[10];

次に、データをビットごとのシフト演算子<<およびで埋め>>ます。複数のソース変数のビット番号を 1 つの宛先変数に結合するには、ビットごとの OR 演算子を使用します|。例えば:

unsigned short block1 = 0x05d3; // binary: 00000101 00111101
// first byte: 1 - 000101 0
buffer[0] = 1 << 7 | (block1 << 2) >> 9;
于 2013-05-01T22:22:18.633 に答える