我正在使用C ++进行基于硬件的SystemC模型设计。 SystemC作为C ++扩展引入了对信号和字节描述有用的特定数据类型。
如何访问数据类型的第一位,例如:
sc_bv<16> R0;
或访问tmp
的前四位。
int my_array[42];
int tmp = my_array[1];
sc_bv是一种位向量数据类型,它存储二进制序列。现在我想要那个数据类型e的前四位。 g ..我的背景是C#和Java,因此我总是想念一些基于OOP和Reflexion的API结构。我需要对这个低级别的东西进行转换。有用的介绍性内容会有很大帮助。
谢谢:), wishi
答案 0 :(得分:2)
对于sc_bv
,您可以使用索引运算符[]
对于int,只需使用常量的常规按位运算,例如: tmp
中的最低有效位是tmp & 1
答案 1 :(得分:1)
我真的不能代表SystemC(听起来很有趣)。在正常的C中,你用这样的掩码读出低四位:
temp = R0 & 0xf;
并且仅写入低4位(假设32位寄存器,temp <16),如下所示:
R0 = (R0 & 0xfffffff0) | temp;
答案 2 :(得分:1)
要访问tmp的前四个(我假设你的意思是四个最高位)位(即获取它们的值),你使用位掩码。因此,如果您想知道例如是否设置了第二位,请执行以下操作:
int second_bit = (tmp & 0x4000000) >> 30;
现在second_bit
为1
,否则为零。这背后的想法如下:
想象一下tmp是(二进制)
1101 0000 0000 0000 0000 0000 0000 0000
现在,您使用具有以下值的按位AND(&
)
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
当且仅当两个操作数都设置了相应的位(它们都是1
)时,ANDing在给定位上产生1
。结果将是:
0100 0000 0000 0000 0000 0000 0000 0000
然后你将这30位向右移动,这使得它成为:
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
请注意,如果原始值的测试位为零,则结果为零。
这样你可以测试你喜欢的任何一点,你只需要提供正确的掩码。请注意,我假设int是32位宽,在大多数情况下应该是真的。
答案 3 :(得分:1)
您需要了解更多关于sc_bv的信息,以确保您获得正确的信息。另外,当你说“前四个字节”时,我认为你的意思是“前四位”。但是,这也是误导性的,因为你真的想在低阶或高阶位之间进行描述。
无论如何,你使用C位运算符来做这种事情。但是,您需要知道整数值的大小和运行时体系结构的“endian-ness”才能做到这一点。
但是,如果你真的只想要前四位,那么你会做这样的事情......
inline unsigned char
first_4_bits(void const * ptr)
{
return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4;
}
这将抓住它所指向的前4位。因此,如果指向的第一个字节是0x38,那么此函数将返回前4位,因此结果将为3.