理解位運算
回答
我們先來看((1 << 5) - 1)
。
1 << 5
等於100000
二進制。- 當我們減去1時,我們剩下了,這是一個五進制數1。
現在,重要的是要明白,a & 0b11111
是一種操作,只保留a
的5個最低有效位。回想一下,當且僅當兩個比特都是1時,兩個比特的&
是1.因此,在第5比特之上的a
中的任何比特因此將從bit & 0 == 0
變爲0。而且,由於bit & 1 == bit
(0 & 1 == 0
和1 & 1 == 1
),位1到位5的所有位都將保留其原始值。
現在,因爲我們在x >>> 3
移位的x
位下降3,失去的x
三個最低位顯著,我們應用上述的比特的處理4〜8(開始於索引1)。因此,操作的結果只保留那些位(如果我們說第一位是位0,那麼確實是位3到位7,正如你所說的那樣)。我們舉一個例子:1234
。在二進制中,這是10011010010
。所以,我們從3開始移位:
10011010010 >>> 3 = 10011010
基本上我們只是修剪掉最後3位。現在,我們可以執行&
操作:
10011010
& 00011111
--------
00011010
這樣,最終的結果是11010
。正如你所看到的,如預期的結果:
bits | 1 0 0 1 1 0 1 0 0 1 0
index | 10 9 8 7 6 5 4 3 2 1 0
^-------^
謝謝!很好解釋。 –
(x >>> 3)
班次x
右側3位從邏輯上講,左側即沒有符號擴展。低階3位丟失。 (這相當於一個無符號除以8)
1 << 5
位移1
左5個比特,即,由32相乘,得到0b00000000000000000000000000100000.
-1
減去一個來自,給予31或0b00000000000000000000000000011111.
&
AND將這些一起,僅產生低階的x >>> 3
結果的5位,在其他字位3 ..7原來x.
「你會怎麼去理解這個?」。
我假設你實際上在問你如何應該去理解它。 (與僅僅向你解釋它的人不同...)
理解它的方法是「手執」它。
拿一張紙和一支鉛筆。
根據您對Java運算符優先級如何工作的理解,找出操作的執行順序。
根據您對每位操作員的理解,在紙上寫入位的輸入模式,並按正確的順序「手執」每項操作。
如果你這樣做與x
幾個值幾次,你應該明白爲什麼這個表達式給你一個5位數字。
如果您爲其他幾個示例重複練習,您應該到達不需要用鉛筆和紙張進行繁瑣過程的地步。
我看到@arshajii基本上爲你做了這個例子。但是我認爲如果你爲自己做/重複工作,你會得到更深的理解。
有一點要記住在Java中的整數和位操作是,操作總是使用32位或64位運算......即使操作數是8位或16位執行。另一件需要記住的事情(儘管這裏不重要)是,移位運算符的右側操作數被切分爲5或6位,這取決於它是32位還是64位操作。
好的Stephen,我會看看一些其他的位操作代碼,並試圖理解它做了什麼。謝謝! –
- 1. 理解模運算
- 2. 理解模運算%
- 3. 理解FFT運算片斷
- 4. 理解指針運算
- 5. 瞭解按位運算 - 移位和AND
- 6. 努力理解python中的按位運算符
- 7. 不能理解按位運算的用法
- 8. 無法理解移位運算符行爲在C代碼
- 9. Python和OpenCV - 我如何理解這個按位運算符?
- 10. 紅寶石位運算解決
- 11. 需要幫助瞭解位運算符
- 12. 解釋使用位運算符
- 13. 按位運算符的工作原理
- 14. 和C預處理位運算符
- 15. 位運算
- 16. 位運算
- 17. PHP,位運算
- 18. 位運算符
- 19. Ç位運算
- 20. 按位運算
- 21. 位運算符
- 22. 位運算
- 23. 理解的CComBSTR賦值運算符
- 24. 的Javascript XOR運算(試圖理解!)
- 25. 理解條件運算的scala
- 26. 理解XOR邏輯運算符
- 27. 理解運算符優先級
- 28. 不能理解點運算符概念
- 29. 理解賦值運算符 - javascript
- 30. Probem理解nodejs中的OR運算符
是的,Java。 15char –