2017-02-22 6 views
0

私はエレガントなC + +を探していますSystemCを使用してビットを連結する。 C++のためのビットを連結するC++

bool my_variable; 
uint bits_combination = {8'b0, {8{my_variable}}, 8'b1, 4'b0, 2'b1, 2'b0}; 

私の最善の解決策:1つの素敵なラインで

AシステムVerilogの例

bool my_variable; 
sc_uint<32> bits_combination; 
bits_combination.range(31,24) = 0; 
bits_combination.range(23,16) = my_variable ? (1 << 8)-1 : 0; 
bits_combination.range(15,8) = (1 << 8)-1; 
bits_combination.range(7,4) = 0; 
bits_combination.range(3,2) = (1 << 2)-1; 
bits_combination.range(1,0) = 0; 

はこのラインを改善する非三項演算子も役立ちますに:

my_variable ? (1 << 8)-1 : 0 
+2

は、一定のビットの残りの部分はありますか?システムのVerilogサンプルのuintは34ビットですか?残りが変更されない場合はマスクとして、または変数がtrueの場合は(255 << 16)にします。 –

答えて

2

のように見える

0b0000'0000'0000'0000'1111'1111'0000'1100 | 
(0b0000'0000'1111'1111'0000'0000'0000'0000 * myVariable) 
1

SystemCでは、コンマ演算子は連結のためにオーバーロードされます。しかし、{8 {my_variable}}のような複写演算子はありません。

ただし、レプリケーションを行う関数を記述できます。例えば:あなたのSystemVerilogのサンプルの

template <int N, int M> 
sc_uint<N*M> replicate(sc_uint<M> val) { 
    sc_uint<N*M> res = 0; 
    for (int i = 0; i < N; ++i) 
     res = (res << M) | val; 
    return res; 
}; 

だから、SystemCのバージョンは次のように見ることができます:

sc_uint<1> my_variable = 1; 
sc_uint<32> bits_concatenation = (sc_uint<8>(0), replicate<8>(my_variable), sc_uint<8>(1), sc_uint<4>(0), sc_uint<2>(1), sc_uint<4>(0)); 
+0

sc_lvをsc_uintにキャストする方法はありますか? その場合、レプリケート機能は必要ありません。 –

+0

私はsc_lvのアイデアをよく理解していません。詳細を教えてください。一般的に、さまざまなデータ型をサポートするテンプレート化されたレプリケーション関数を書くことが可能だと思います。 – random

+0

sc_lvは任意の幅の論理型です これはsc_lvのドキュメントですhttp://www.lysium.de/docs/systemc-2.2/docs/html/classsc__dt_1_1sc__lv.htmlすべてのビットを同じ値に初期化するc'torがあります:テンプレート sc_dt :: sc_lv < W > :: sc_lv \t(\tブール\t init_value \t) –