2011-05-18 24 views
3

我們劃分了一個int值來保存三個值。例如,前8位(從左到右)保存一個值,第8到第12位保存另一個值,其餘位保存第三個值。檢索存儲在int的某些位中的值

我正在編寫一個實用程序方法來從int的特定範圍的位中獲取值。這夠好嗎?你有更好的解決方案嗎? startBitPos和endBitPos從右到左計數。

public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{   
    //parameters checking ignored for now   
    int tempValue = intNum << endBitPos; 
    return tempValue >> (startBitPos + endBitPos); 
} 

編輯:

我相信所有的值將是unsign。

+0

出於好奇,爲什麼你用這種方式'int',而不是將每個值分別存儲在它自己的類型? – 2011-05-18 19:15:37

+0

代碼是否正確?我想知道符號位會發生什麼。 – Kaj 2011-05-18 19:16:39

+0

數據來自硬件。他們想要節省空間。所有的值都是不正確的。 – 5YrsLaterDBA 2011-05-18 19:23:16

回答

9

不,這是不是在那一刻完全正確:

  • 您應該使用無符號向右移位運算符,以避免負數結束了,當你不希望他們。 (當然,假設原始值是無符號的。)
  • 您不會左移適當的數量以清除無關的高位。

我懷疑你想:

// Clear unnecessary high bits 
int tempValue = intNum << (31 - endBitPos); 
// Shift back to the lowest bits 
return tempValue >>> (31 - endBitPos + startBitPos); 

個人而言,我會覺得更舒適口罩和移位比這雙班,但我發現拿出的東西,因爲它很難如上所述。

+0

該代碼不正確。它返回例如bitsValue的錯誤結果(0x80000001,24,32); – Kaj 2011-05-18 19:39:03

+0

@Kaj:endBitPos如何可以是32?這是一個32位整數的結尾。我假設他們是基於0的位數,包括兩者在內。但是,有一個不正確的標誌。 'bitsValue(0x80000001,24,31)'現在返回128,這是我所期望的。爲了讓'endBitPos'獨佔,你可以將31更改爲32. – 2011-05-18 19:42:15

+0

這是一個問題,它應該是包容還是獨佔?爲bitsValue(0x80000001,24,31)返回128可能是正確的。該方法可能需要javadoc:ed。從右向左讀起始位非常混亂。 – Kaj 2011-05-18 19:55:18

0

如果你只有一對夫婦的固定長度的「面具」,你可以明確地存儲和使用它們像這樣:

int [] masks = new int [4]; 
int masks[0] = 0x11111111; 
int masks[1] = 0x111100000000; 
// ... 

public int getValue(int input, int mask){ 
    return input & masks[i]; 
} 
+0

我不認爲那個代碼是正確的(如果我理解了這個問題)。他希望得到位表示的實際值,這意味着你必須將它們移位(並注意符號位) – Kaj 2011-05-18 19:31:21

+0

你是對的@Kaj。如果是這種情況,那麼還需要爲每個掩碼存儲一個數字,以表示爲了得到正確的結果而需要向下移動一個值的距離。 – thalador 2011-05-18 19:33:41

1
public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{   
    int mask = ~0; //or 0xffffffff 
    //parameters checking ignored for now   
    mask = ~(mask<<(endBitPos)) & mask<<startBitPos 
    return intNum & mask; 
} 

但是如果你常用bitranges這是更好地保持口罩他們靜態

0xff000000 // is the 8 most significant bits 
0x00e00000 // is the next3 bits and 
0x001fffff // are the remaining 21 bits