连接位C ++

时间:2017-02-22 12:55:55

标签: c++ bit-manipulation systemc

我正在寻找一个优雅的C ++,使用SystemC来连接位。

系统Verilog示例在一个不错的行中:

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

我对C ++的最佳解决方案:

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 个答案:

答案 0 :(得分:2)

看起来像

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

答案 1 :(得分:2)

在SystemC中,逗号运算符重载以进行连接。但是没有像{8 {my_variable}}这样的复制运算符。

但是,您可以编写一个可以进行复制的函数。例如:

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;
};

所以SystemVerilog示例的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) );