Java - Bitwise AND "&" operator application

位元運算在我們一開始學程式語言時,通常在邏輯運算子介紹時也會講到。不過,實際上

當我在撰寫程式時,通常沒有使用到它,因為不太曉得要怎麼應用XD,只能說自己還太

嫩了orz..。而在這邊主要是講到AND運算子的應用。

相信AND的運算書上已經講得很清楚,假設有一個數字為16,二進位表示式為0001 00002

而有一數字15,二進位表示式為0000 11112,若兩個數字做&運算會得到0

    0001 0000
&  0000 1111
    --------------
    0000 0000 => 結果

即AND的特性是1與1才會輸出1,其餘均為0

由上例觀之任何一個數字跟15做AND運算所得到的結果都會<=15

現在我們舉一個應用例子,如下:

public class Bitwise_AND {
   static int DEFAULT_OPACITY = 16;
   static String table[] = new String[DEFAULT_OPACITY];
   public static void main(String args[]){
      int index = 0;
      String str1 = "123";
      String str2 = "456";
      index = indexFor(str1.hashCode(), table.length-1);
      table[index] = "Hello";
      System.out.println("str1 mapping value => table index is "+index);
      index = indexFor(str2.hashCode(), table.length-1);
      table[index] = "Java!";
      System.out.println("str2 mapping value => table index is "+index);
      System.out.println("str1 mapping value is "+getValue(str1.hashCode(), table.length-1));
      System.out.println("str2 mapping value is "+getValue(str2.hashCode(), table.length-1));
   }
   public static int indexFor(int hash, int length){
      return hash & length;
   }
   public static String getValue(int hash, int length){
      int i = indexFor(hash, length);
      return table[i];
   }
}

輸出結果:

str1 mapping value => table index is 2
str2 mapping value => table index is 5
str1 mapping value is Hello
str2 mapping value is Java!

上面這個例子作的事情很簡單,主要有一個table陣列,長度為16,分別打算存放str1與str2

的對應值,不過這邊比較特別的是,將這兩個值存放至table,不是放至0 and 1的位置,

而是先透過indexFor method幫我們計算出與str1有關的index value,得到的這個value是利用

AND運算求得的囉!

如此一來,當我們之後想求得 "123" 對應的值時,只需要利用indexFor幫我們求得

它專屬的index值,再帶進table,取得對應的值 => "Hello",如此一來"123"就像一把鑰匙

一樣囉!可以一步到位,我們也可以很明確地知道"Hello"值怎麼求得!

再來,indexFor丟進去的參數,一個數值為"123"的hashcode及table.length-1(15)去做

AND運算,從最一開始的AND運算介紹可以得到,任何一個數字與15做AND運算,會得

到0 ~ 15的數字範圍,也剛好可以符合table可以指定的index範圍。

PS. 如果以15去算的話,會以0000 11112與其他數字做運算,如此可以得到2*2*2*2

等16種的結果,即0 ~ 15的值,這就是為什麼不帶進16,而是15了,若帶進16

0001 00002,只會有2種結果,即0 or 16 XDDD

結論:

1. 此處純粹只是帶一下AND運算的用法,並不會考慮到碰撞(collision)的問題,即假設當

    有第三個字串"XXX"做AND運算求得與第一個字串"123"相同的index值時,明明這兩個

    字串不同,總不能覆蓋掉"123"的value吧XD,所以就要另外處理了。

2. 這個應用例子是參考Java HashMap source code所得到的!

留言