2010-11-22 9 views
0

SystemCでハードウェアベースのモデル設計にC++を使用しています。 C++の拡張機能であるSystemCは、シグナルとバイトの説明に役立つ特定のデータ型を導入しています。C++によるデータ型のビットへの選択的アクセス

sc_bv<16> R0; 

またはtmpの最初の4ビットにアクセス:

は、どのように私のような一般的なデータ型の最初のビットにアクセスすることができます。

int my_array[42]; 
int tmp = my_array[1]; 

sc_bvはバイナリシーケンスを格納するビットベクトルデータ型です。今度は、そのデータ型の最初の4ビットが必要です。 g。私の背景はC#とJavaです。したがって、一般的なOOPとReflexionベースのAPI構造のいくつかが欠けています。私はこの低レベルのもので変換を実行する必要があります。便利な入門用のものが多く役立ちます。

おかげ:)、 wishi

答えて

2

sc_bvについて、あなただけ例えば、定数、と通常のビット演算を使用して、int型の場合はインデックス演算子[]

を使用することができますtmpの最下位ビットはtmp & 1

1

は、私は本当にのSystemC(ただし面白そう)のために話すことはできません。通常Cにそうようなマスクを用いて下位4ビットを読み出したい:

temp = R0 & 0xf; 

をので、等だけ下位4ビット(32ビットレジスタを仮定し、そして温度< 16)に書き込む:

R0 = (R0 & 0xfffffff0) | temp; 
1

です。最初の4つのビット(つまり4つの最上位ビットを意味します)にアクセスするには、ビットマスクを使用します。あなたが知りたい場合は、たとえば2番目のビットがセットされている場合ので、あなたは、次の操作を行います。

int second_bit = (tmp & 0x4000000) >> 30;

は今 second_bitビットがセットされている場合 1ゼロそうです。この背後にある考え方は以下の通りです:

はtmpが今、あなたは次の値
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
でビット単位のAND(&)を使用する(バイナリ)
1101 0000 0000 0000 0000 0000 0000 0000
さAND演算は、与えられたビットに1を生成想像します両方のオペランドが対応するビットがセットされている場合にのみ(両方とも1です)。だから、結果は次のようになります。
0100 0000 0000 0000 0000 0000 0000 0000
次に、あなたはそれが可能になり、右、この30ビットをシフト:
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
注元の値がテストしたビットにゼロを持っていた場合、結果がゼロになること。

あなたが好きなビットをテストすることができますこの方法で、あなたは正しいマスクを提供する必要があります。 intは32ビット幅であると仮定していることに注意してください。これはほとんどの場合真です。

1

正しい情報を確実に取得するには、sc_bvについてもう少し知る必要があります。また、「最初の4バイト」と言うときは、「最初の4ビット」を意味します。しかし、これは誤っていることもあります。なぜなら、実際には下位ビットと上位ビットの間を線引きしたいからです。

いずれにせよ、この種のものにはCビット演算子を使用します。ただし、その値を取得するには、整数値のサイズとランタイムアーキテクチャの「エンディアン」を知る必要があります。

しかし、あなたは本当にただ最初の4ビットをしたい場合、あなたはこのような何かをするだろう...

inline unsigned char 
first_4_bits(void const * ptr) 
{ 
    return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4; 
} 

と、それはそれがで指摘されているものの非常に最初の4ビットをつかむだろう。したがって、最初のポインティング先が0x38の場合、この関数は最初の4ビットを返しますので、結果は3になります。

関連する問題