使用C ++选择性访问数据类型的位

时间:2010-11-22 14:06:46

标签: c++ casting bit-manipulation systemc

我正在使用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

4 个答案:

答案 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_bit1,否则为零。这背后的想法如下:

想象一下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.