2015-04-04 46 views
0
private static long permute(byte[] table, int srcWidth, long src) { 
    long dst = 0; 
    for (int i=0; i<table.length; i++) { 
     int srcPos = srcWidth - table[i]; 
     dst = (dst<<1) | (src>>srcPos & 0x01); 
    } 
    return dst; 
} 

此處dst =(dst < < 1)| (src >> srcPos & 0x01);這個怎麼用??我假設|是OR運算符?如何用java中的OR運算符定義變量

+1

這不是定義變量。 '''特別是[按位包含或運算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)。當你問「這項工作如何」時,你想知道什麼? – 2015-04-04 20:24:15

+2

它將'dst'左移1位,然後執行按位或'src'。考慮從左到右的每個操作。 – 2015-04-04 20:25:58

+0

@AndyTurner你可以給我一個簡單的解釋,我已經特別標記了這個工作方式? – user2475511 2015-04-04 20:31:42

回答

1

|是位或不是邏輯OR

按位或在每個位長單獨運行。這改變了它的價值,這與定義它不一樣。

打破這一行:

dst = (dst<<1) | (src>>srcPos & 0x01); 

dst<<1 // means left shift 1 place. The same as multiply by 2. Zeros lowest bit. 

src>>srcPos // means right shift srcPos places. The same as divide by 2 to the srcPos 
      // this puts the selected bit in the lowest place 

& 0x01 // means set every bit to zero except the rightmost one which will stay the same 

(src>>srcPos & 0x01) // means give me the value of the src bit at srcPos 

(dst<<1) | (src>>srcPos & 0x01); // means shift dst left and put a src bit at the end 

這裏位OR就像它附加了一下。這隻適用於因爲不使用的位在每邊都被仔細清零。

隨着循環流逝table正在控制從src採樣哪個位,並且它所選的任何內容都附加在dst的右端。因此table控制如何排列src

3

考慮按位「和」和「或」操作的一種方法是設置(打開)和復位(關閉)結果中的位。

你認爲它是一個操作數作爲你的「掩碼」 - 表示需要設置或重置的一個和零。另一個操作數將被該「掩碼」「屏蔽」。通過以下方式:

如果運算符是&,則「掩碼」中零的每個位在結果中將爲零。每個爲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移動一個位置到左邊,最右邊的位被設置爲零。實質上,這是爲最右邊的東西「騰出空間」。
  • 在右括號中,移位運算符具有優先權,因此首先進行評估。 srcsrcPos位移到右側。所以從右邊的位置是srcPos+1現在是最右邊的位。
  • 現在我們用0x01「掩蓋」那個。那就是,0b00000000_00000000_00000000_00000001。這是一個&掩碼,因此所有不是最右邊的位都將爲零。只保存最右邊的位。最終的結果是,它曾經在的地方src只有位 - 所有其餘的重置。
  • 現在我們用dst<<1這個東西來「掩蓋」這個東西。由於它是一個|操作,它是一個「設置」掩碼。我們的面具只有一個顯着位 - 我們在&操作中沒有擦除。它處於最右邊的位置。如果它是1,結果將爲1,如果結果爲0,則結果爲0(因爲左邊的操作數在該位置爲零)。

所以基本上它的作用是:在dst

  • 推位到左側。
  • 將右邊的srcPos + 1位放置在最右邊的位。

如果table的值是0和srcWidth之間的所有獨特的位置,那麼這會給你一個擾碼的src位的 - 每輪一個位將基於對table[i]值被推入dst。 「

1

」|「是二進制或運算符,如果它存在於任一操作數中,它將複製一位。 作爲一個例子:

A|B 

會給61是0011 1101

「||」 被稱爲邏輯OR運算符。如果兩個操作數中的任何一個非零,則條件成立。作爲示例:

(A || B)爲真。