2011-11-02 139 views
1

我有一個int,我想使用〜位運算符反轉它的位。這應該是一件非常簡單的事情,但我嘗試過,並且不起作用。我想這是因爲java使用二進制補碼來表示它是int。那麼最有效的方法是什麼? 50時,倒置應該是13,這就是我想要的值在java中使用int的位操作

+1

只有當你處理6位時,50纔會變爲13,這是一個不尋常的事情,因爲char是8位。你確定你的目標是正確的嗎? – Toomai

+0

和100被轉換爲27.爲了文字,我需要將這個int轉換爲一個字節數組,我猜想並反轉它 – xonegirlz

+1

請解釋爲什麼你認爲50應該變成13 ...你只是試圖將位反轉到儘可能遠原始int中的最高設置位? –

回答

2

看來你只想要部分的按位補碼,直到輸入中最顯着的設置位。然後你只需要掩蓋的補充,

int invert(int n) { 
    return ~n & mask(n); 
} 
int mask(int n) { 
    n |= n >> 1; 
    n |= n >> 2; 
    n |= n >> 4; 
    n |= n >> 8; 
    return n | (n >> 16); 
} 
+0

你介意給我一些以上方法的解釋 – xonegirlz

+0

如果n有第k位設置但不高於,掩碼(n)有位0到k設置,(k + 1)到31設置。對於每個設置位,下一個較低位也被設置,例如'0x40'變爲'0x60',那麼對於每組兩個設置位,下一個較低組爲由'n | = n >> 2;'設置,例如給出'0x78'。繼續將組位長度加倍,直到最高位組的組保持包含第0位。然後在反轉中,我們採取完整的按位補碼並掩蓋我們不感興趣的內容。 –

-1

由於一個int應寬至少32位,50〜絕對不是13.我想你是假設int是隻有8位寬,這可能在237年前已經是這種情況,但絕對不是現在,也不是Java中的情況。如果您需要保證爲8位寬的數據類型,請使用byte

但即使如此,〜50不是13,只要考慮到最低有效位6位。但是這一切與二補不相關。

0

Java int是32位長,1位用於符號。因此50以二進制表示爲00000000000000000000000000110010。如果你反轉這個,你會得到11111111111111111111111111001101,這是十進制表示法中的java整數值-51。