考慮按位「和」和「或」操作的一種方法是設置(打開)和復位(關閉)結果中的位。
你認爲它是一個操作數作爲你的「掩碼」 - 表示需要設置或重置的一個和零。另一個操作數將被該「掩碼」「屏蔽」。通過以下方式:
如果運算符是&
,則「掩碼」中零的每個位在結果中將爲零。每個爲1的位都將具有來自其他操作數的值。
因此,例如result = x & 0b11111111_11111111_11111111_11110111
(這個大數字是我們的掩碼,並且我用二進制顯示它)將具有與x
相同的所有位,除了從右邊開始的第四位將變爲0 ,無論是x
中的0還是1。
這樣做帶有「掩碼」的&
被認爲是「位重置」操作或「歸零」操作。
對於|
(或)運算符,您可以將其視爲「位集」操作。結果中,掩碼中1的每個位都將爲1。 0的每一位都將具有其他操作數中的任何值。所以在結果中,掩碼中所有1位都將被設置。
例如,result = x | 0b1000
將包含x中的所有位,除了右邊的第四位,無論它在x中是什麼,它將變爲1。
用二進制書寫掩碼很長,在Java中是一個相當新的事物,所以你很可能會看到用十六進制寫的掩碼。在這種情況下,0xfffffff7
爲&
示例,0x8
爲|
示例。
現在,讓我們看看你表達的觀點是「面具」點:
dst<<1
指1.它的所有位移dst
移動一個位置到左邊,最右邊的位被設置爲零。實質上,這是爲最右邊的東西「騰出空間」。
- 在右括號中,移位運算符具有優先權,因此首先進行評估。
src
將srcPos
位移到右側。所以從右邊的位置是srcPos+1
現在是最右邊的位。
- 現在我們用
0x01
「掩蓋」那個。那就是,0b00000000_00000000_00000000_00000001
。這是一個&
掩碼,因此所有不是最右邊的位都將爲零。只保存最右邊的位。最終的結果是,它曾經在的地方src
和只有位 - 所有其餘的重置。
- 現在我們用
dst<<1
這個東西來「掩蓋」這個東西。由於它是一個|
操作,它是一個「設置」掩碼。我們的面具只有一個顯着位 - 我們在&
操作中沒有擦除。它處於最右邊的位置。如果它是1,結果將爲1,如果結果爲0,則結果爲0(因爲左邊的操作數在該位置爲零)。
所以基本上它的作用是:在dst
- 推位到左側。
- 將右邊的
srcPos
+ 1位放置在最右邊的位。
如果table
的值是0和srcWidth
之間的所有獨特的位置,那麼這會給你一個擾碼的src
位的 - 每輪一個位將基於對table[i]
值被推入dst
。 「
這不是定義變量。 '''特別是[按位包含或運算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)。當你問「這項工作如何」時,你想知道什麼? – 2015-04-04 20:24:15
它將'dst'左移1位,然後執行按位或'src'。考慮從左到右的每個操作。 – 2015-04-04 20:25:58
@AndyTurner你可以給我一個簡單的解釋,我已經特別標記了這個工作方式? – user2475511 2015-04-04 20:31:42