2011-11-16 5 views
1

私は私が正しくこれらのフィールドを抽出していた場合、あなたが私に言うことができる期待していたC.でCPUキャッシュエミュレータを構築しています:ビットシフトを使用してこれらのフィールドを正しく抽出していますか? (タグ、インデックス、オフセット)

32ビットアドレスのように分割する必要があります次の:

void extract_fields(unsigned int address){ 

    unsigned int tag, index, offset; 

    // Extract tag 
    tag = address >> 12; 

    // Extract index 
    index = address << 20; 
    index = index >> 22; 

    // Extract offset 
    offset = address << 30; 
    offset = offset >> 30; 

} 

何かアドバイスがはるかに高く評価されています。ここでは

+---------------------------------------------------+ 
| tag (20 bits) | index (10 bits) | offset (2 bits) | 
+---------------------------------------------------+ 

は、それぞれの値を取得するために私のコードです!

+1

は、なぜあなたは 'タグ=タグ<< 12'をやっていますか? –

+0

おっと、私はそこにいるべきではないと思います。ありがとう。 – user982864

答えて

2

あなたのソリューションのように見えますが、しばしば別の方法で行われますが、これはおそらくもう少し明確です。ご例えば

// Shift off the lowest 12 bits, and mask off the higher ones 
tag = (address >> 12) & 0xFFFFF; 

// Shift off the lowest 2 bits, and mask off the higher ones 
index = (address >> 2) & 0x3FF; 

// Shift off the lowest 0 bits, and mask off the higher ones 
offset = (address >> 0) & 0x3; 
関連する問題