2010-11-22 110 views
0

我正在使用C++進行基於硬件的SystemC模型設計。作爲C++擴展的SystemC引入了對信號和字節描述有用的特定數據類型。使用C++選擇性訪問數據類型的位

我如何可以訪問的數據類型的第一位在一般情況下,這樣的:

sc_bv<16> R0; 

或訪問tmp前四位。

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

sc_bv是位向量數據類型,它存儲二進制序列。現在我想要這些數據類型的前四位。 g ..我的背景是C#和Java,因此我總是想念一些基於OOP和Reflexion的API構造。我需要在這個低級別的東西上進行轉換。有用的介紹性內容會有很大的幫助。

謝謝:), wishi

回答

2

對於sc_bv,你可以使用索引操作符[]

對於整型,只是用正常位運算與常量,如tmp中的最低位是tmp & 1

1

我真的不能針對SystemC說話(聽起來很有趣,雖然)。在正常的C你會讀出的低四位與掩模像這樣:

temp = R0 & 0xf; 

和只寫入低四位(假設一個32位寄存器,和臨時< 16)像這樣:

R0 = (R0 & 0xfffffff0) | temp; 
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當且僅當兩個操作數都設置了相應的位(它們都是1)。因此,其結果將是:
0100 0000 0000 0000 0000 0000 0000 0000
那麼你這30位右移,這使得它是:
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
注意,如果原始值過測試位爲零,結果將是零。

這樣你可以測試你喜歡的任何一點,你只需要提供正確的掩碼。請注意,我在這裏假設int是32位寬,在大多數情況下應該是true。

1

您將不得不更多地瞭解sc_bv以確保您獲得正確的信息。另外,當你說「前四個字節」時,我假設你的意思是「前四位」。但是,這也是誤導,因爲您確實想要在低位或高位之間進行劃分。

在任何情況下,您都會使用C位運算符來表示這種事情。但是,您需要知道整數值的大小以及運行時體系結構的「endian-ness」才能正確使用。

但是,如果你真的想僅僅前4位,那麼你會做這樣的事......

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

而且會抓住它正指向什麼很前4位。所以,如果指向的第一個字節是0x38,那麼這個函數將返回前4位,所以結果將是3.