2012-12-21 38 views
1

我使用cpuid操作碼來檢索處理器模型和擴展模型的值。我正在使用的文檔說,我必須將擴展模型的值與模型的值連接起來,並且可以獲得正確的模型。連接4位整數

Ex. Model:   2h 
Model:    Eh 
Required Output: 2Eh 

這是一個例子,但還有更多的喜歡它。我如何將這兩個數連接在一起(即4位無符號整數)以在C++中接收所需的輸出?

+1

我想你會使用比特移位操作。你也可以使用聯盟。 – RonaldBarzell

回答

5

Shift鍵並添加:

exModel = 0x2; 
model = 0xE; 

output = (exModel << 4) + model; 

由於這是在評論上面提到的,你也可以使用一個工會,但我不會推薦它 - 它使代碼非常不可移植的(我認爲違反嚴格的別名規則):

union myUnion 
{ 
    unsigned char output; 
    struct 
    { 
     unsigned char model : 4; // the order of these two fields 
     unsigned char exModel : 4; // is system dependent 
    }; 
}; 

union myUnion u; 

u.exModel = 0x2; 
u.model = 0xE; 

output = u.output; 
+0

寫入一個聯合字段,然後從另一個字段讀取違反了嚴格的別名規則。 – ildjarn

+0

@ildjarn:除了使用'char'變種,我想。 (絕對可以用'char',只是不確定顯式(未)簽名的版本)。可以以同樣的方式將標準佈局類類型視爲一系列字節。 – GManNickG

+0

@GManNickG:啊,我用錯了措辭。真正的問題是(根據§9.6/ 1)位字段的分配和對齊是由實現定義的,但答案已經涵蓋了(「不可移植」)。 : - ] – ildjarn

1

Shift - yes。

Union - no。

例子:

unsigned char ex_model = 0x2; 
unsigned char model = 0xe; 
unsigned int i = (ex_model << 4) | model; 
+0

你可以在裏面使用一個具有位域結構的聯合。它看起來很糟糕,並且不可移植,但它可能(可能)起作用。 –

+0

@Carl:呃,確切地說。 – TonyK