位元運算在我們一開始學程式語言時,通常在邏輯運算子介紹時也會講到。不過,實際上
當我在撰寫程式時,通常沒有使用到它,因為不太曉得要怎麼應用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
現在我們舉一個應用例子,如下:
輸出結果:
上面這個例子作的事情很簡單,主要有一個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所得到的!
當我在撰寫程式時,通常沒有使用到它,因為不太曉得要怎麼應用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,不是放至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所得到的!
留言
張貼留言