如下的位標記模式(bit flag pattern)是很普通的技術常識,在圖形用戶界面GUI程序的公用API中得到了廣泛應用。呵呵,我們可能正在為資源有限設備如蜂窩電話或者PDA編寫一個Java GUI程序。對GUI中每個構件如按鈕(button)和下拉列表(drop-down list)都擁有一些Boolean選擇項標記。使用位標記,可以將許多選擇項安排到一個變量中。
//The constants to use with our GUI widgets: GUI構件使用的選擇項常量final int visible = 1 << 0; // 1 可見?final int enabled = 1 << 1; // 2 使能?final int focusable = 1 << 2; // 4 focus?final int borderOn = 1 << 3; // 8 有邊界?final int moveable = 1 << 4; // 16 可移動?final int editable = 1 << 5; // 32 可編輯?final int borderStyleA = 1 << 6; // 64 有樣式A邊界?final int borderStyleB = 1 << 7; //128有樣式B邊界?final int borderStyleC = 1 << 8; //256有樣式C邊界?final int borderStyleD = 1 << 9; //512有樣式D邊界?//etc.myButton.setOptions( 1+2+4 ); //set a single widget.int myDefault= 1+2+4; //A list of options.int myExtras = 32+128; //Another list.myButtonA.setOptions( myDefault );myButtonB.setOptions( myDefault myExtras );
為了更好的應用位運算,需要把握所謂的標準技巧,也就是那些可以應用的位運算方法。J2SE 5.0 Tiger版本內增加了一些新的位運算API。假如你使用的是老版本,只要剪切粘貼那些方法實現到你的代碼中。最近由Henry S. Warren,Jr編寫的書籍Hacker's Delight內包含了很多關于位運算算法的資料。
下表展示了一些運算,這些運算可以通過一行代碼或者通過一次調用API方法實現
欲了解上面API方法的運行時間,可以閱讀JDK中相應的 public static int highestOneBit(int i){ i = (i >> 1); i = (i >> 2); i = (i >> 4); i = (i >> 8); i = (i >> 16); return i - (i >>> 1);}
//棋盤上64個格子所有可能狀態的整數枚舉 final int EMPTY = 0;final int WHITE_PAWN = 1;final int WHITE_KNIGHT = 2;final int WHITE_BISHOP = 3;final int WHITE_ROOK = 4;final int WHITE_QUEEN = 5;final int WHITE_KING = 6;final int BLACK_PAWN = 7;final int BLACK_KNIGHT = 8;final int BLACK_BISHOP = 9;final int BLACK_ROOK = 10;final int BLACK_QUEEN = 11;final int BLACK_KING = 12;
進一步,串聯多個64位集合可以用于實現Conway生命游戲(Conway’s Game of Life, 見圖6),一個在大的柵格上進行的模擬游戲。 游戲中新單元的生死由相鄰單元的數量確定,游戲在一代代的單元繁衍中進行。當一個死去單元的四周具有3個生存單元時會復活。 一個單元的相鄰單元中沒有生存的或者僅有一個生存的,這個單元就死亡了(由于寂寞)。具有多于三個相鄰生存單元的單元也會死亡(由于人口擁擠)。相鄰單元的出生(復活)、生活,死亡,會對當前單元的狀態造成很多改變。圖6中顯示了一個生命構造圖,它會不斷繁衍,生存下去,從而通過柵格。使用下面描述的算法我們可以生成模擬生存過程的下一步: