2017-02-05 57 views
0

我有一個最後32位整數加載一個32位整數如何使用值從其它整數

int32_t final; 

其格式是

6 bits 5 bits 5 bits 5 bits 5 bits 6 bits 
opcode rs  rt  rd  shamt funct 

我已經操作碼填入0。我有RS rt和rd分別填充各自的整數。 shamt有它的價值,功能也是如此。我唯一的問題是,我怎麼這些加載到最終詮釋?我知道它有什麼做的< <操作和邏輯像&和|。我有這個功能

unsigned mask(unsigned a, unsigned b) 
{ 
    unsigned r = 0; 
    unsigned i; 
    for (i=a; i<=b; i++) 
     r |= 1 << i; 

    return r; 
} 

它創建一個掩碼,可以通過一個值來獲得它的位a-b。我在正確的軌道上嗎?

+1

使用帶符號整數進行位操作可能不是一個好主意。 –

回答

4

雖然我發現基於位域Stargateur的解決方案很優雅,此基於「普通」左移一個解決方案:請注意,數據類型是無符號,而不是簽署:

uint32_t final; 

int opcode = 0; 
int rs = 10; 
int rt = 20; 
int rd = 11; 
int shamt = 12; 
int funct = 11; 

final = opcode; 
final <<= 5; final |= rs; 
final <<= 5; final |= rt; 
final <<= 5 ;final |= rd; 
final <<= 5; final |= shamt; 
final <<= 6; final |= funct; 

printf("0x%08x", final); 
+0

這只是打印0每次當我嘗試打印終值 –

+0

@ConnorSchwinghammer看https://ideone.com/4iFe4g時間。你確定你沒有犯錯嗎? – Stargateur

+0

好這個工程幾乎是完美的,但對於一些reaosn我缺少了加$ T2,T3 $,$ T4是0x16c5020時,它應該是一個領先的0.我的結果0x016c5020 –

3

你可以使用一個位字段:

union foo { 
    uint32_t header; 
    struct { 
    uint32_t opcode : 6, 
      rs : 5, 
      rt : 5, 
      rd : 5, 
      shamt : 5, 
      funct : 6; 
    }; 
}; 

例子:

int main(void) 
{ 
    union foo foo; 

    foo.opcode = 5; 
    foo.rs = 0; 
    foo.rt = 0; 
    foo.rd = 0; 
    foo.shamt = 0; 
    foo.funct = 5; 
    printf("%x\n", foo.header); 
} 

注:這不處理字節順序,這是執行的行爲https://stackoverflow.com/a/6044223/7076153。如果你想以便攜式使用按位。

+0

但我需要能夠打印最後32,但整數作爲十六進制值 –

+0

@ConnorSchwinghammer只是'的printf(「%X \ n」,foo.header)'。那爲什麼我使用工會。 – Stargateur

+0

所以加載它做我這樣做foo.opcode = myOpcode? –

0

您可以或許有這樣的事情:

int32_t constructFinal (unsigned opcode, unsigned rs, unsigned rt, unsigned rd, unsigned shamt, unsigned funct) { 
    unsigned final = ((opcode & 0x3F) << 26) | 
    ((rs & 0x1F) << 21) | 
    ((rt & 0x1F) << 16) | 
    ((rd & 0x1F) << 11) | 
    ((shamt & 0x1F) << 6) | 
    (funct & 0x3F); 
    return (int32_t)final; 
}