我有一個int,我想使用〜位運算符反轉它的位。這應該是一件非常簡單的事情,但我嘗試過,並且不起作用。我想這是因爲java使用二進制補碼來表示它是int。那麼最有效的方法是什麼? 50時,倒置應該是13,這就是我想要的值在java中使用int的位操作
回答
看來你只想要部分的按位補碼,直到輸入中最顯着的設置位。然後你只需要掩蓋的補充,
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);
}
你介意給我一些以上方法的解釋 – xonegirlz
如果n有第k位設置但不高於,掩碼(n)有位0到k設置,(k + 1)到31設置。對於每個設置位,下一個較低位也被設置,例如'0x40'變爲'0x60',那麼對於每組兩個設置位,下一個較低組爲由'n | = n >> 2;'設置,例如給出'0x78'。繼續將組位長度加倍,直到最高位組的組保持包含第0位。然後在反轉中,我們採取完整的按位補碼並掩蓋我們不感興趣的內容。 –
由於一個int
應寬至少32位,50〜絕對不是13.我想你是假設int
是隻有8位寬,這可能在237年前已經是這種情況,但絕對不是現在,也不是Java中的情況。如果您需要保證爲8位寬的數據類型,請使用byte
。
但即使如此,〜50不是13,只要考慮到最低有效位6位。但是這一切與二補不相關。
Java int
是32位長,1位用於符號。因此50以二進制表示爲00000000000000000000000000110010
。如果你反轉這個,你會得到11111111111111111111111111001101
,這是十進制表示法中的java整數值-51。
- 1. 位操作,以獲得32位的int
- 2. 在Java中使用Unsigned int 32位?
- 3. java位操作
- 4. 在java中使用位操作符時使用哪個包?
- 5. 如何在Swift中使用位操作?
- 6. 的Javascript:操作使用float和int
- 7. 使用位操作以確定是否int是2
- 8. 使用位操作操作符的位格式轉換
- 9. 3D陣列C++使用INT []操作
- 10. 使用int和long進行操作
- 11. 你可以使用C++中的bool和int操作符執行哪些操作?
- 12. 按位操作的操作
- 13. 如何使用int []在Android中Java的
- 14. 如何使用按位操作將4個字符存儲到unsigned int中?
- 15. 使用Java操作JavaScript
- 16. 在32位操作系統中使用64位dll
- 17. int轉換成位陣列並做旋轉操作,這些位
- 18. Java的非標準位操作
- 19. 時髦的java按位操作?
- 20. 使用整數提升的位操作
- 21. 的MongoDB:使用$位置操作查詢
- 22. 使用C++ boost庫的按位操作
- 23. 位操作在Perl
- 24. 在Java中的多個操作數上按位異或運算
- 25. 性能在Java中的移位操作與C++
- 26. 在java中的位操作,相比於c
- 27. 在java中操作類
- 28. 在java中計時操作
- 29. c中的位操作
- 30. 裝配中的位操作
只有當你處理6位時,50纔會變爲13,這是一個不尋常的事情,因爲char是8位。你確定你的目標是正確的嗎? – Toomai
和100被轉換爲27.爲了文字,我需要將這個int轉換爲一個字節數組,我猜想並反轉它 – xonegirlz
請解釋爲什麼你認爲50應該變成13 ...你只是試圖將位反轉到儘可能遠原始int中的最高設置位? –