Java海闊天空

          編程是我的生活,但生活不僅僅是編程。

          使用二進制實現標志疊加

           

          每一個標志都使用一個以1開頭,后面全部接0的二進制表示,長度不限,:

          int x = 0x8             ->           1000

          int y = 0x10           ->           10000

          int z = 0x20           ->           100000

          疊加的結果是:int a = x | y | z.    -> 111000

          判斷是否有x標志:

          if((a & x) == x)            -> 如果返回值為真,表示確實包含了x標記.

          代碼:

                 int x1 = 0x8;

                 int y1 = 0x10;

                 int z1 = 0x20;

                 int rrr = x1 | z1;

                 if((rrr & x1) == x1)

                 {

                        printf("x標記"n");

                 }

                 if((rrr & y1) == y1)

                 {

                        printf("y標記"n");

                 }

                 if((rrr & z1) == z1)

                 {

                        printf("z標記"n");

                 }

          示例:

          package com.aptechb;

          import java.util.Scanner;

          /**
           * 應用一:保存狀態
           * <hr>
           * 比如在描述一個人的愛好時,會用多個復選框標識出選項:閱讀,看電視,交際等,如何保存到數據庫比較好呢?
           */

          public class Binary {

           public static void saveStatus() {
            int status = 0x0; // 用于保存愛好,如果愛好項目很多,可以用long等.每一位保存一個愛好.
            // 假設:
            // 0000 0000 0000 0000 0000 0000 0000 1111
            // 從低位到高位分別保存閱讀,交際,電影,喝咖啡,即
            // 0000 0000 0000 0000 0000 0000 0000 1(喝咖啡)1(電影)1(交際)1(閱讀)
            // 如果為0表示沒有該愛好.

            // 比如我的愛好有:電影,閱讀,則
            // status = 0x5;
            // 將0x5與0x1做&運算,如果結果為0x1,則表示閱讀是我的愛好
            // 將0x5與0x10做&運算,如果結果為0x10,則表示交際是我的愛好
            // 將0x5與0x100做&運算,如果結果為0x100,則表示電影是我的愛好
            // 將0x5與0x1000做&運算,如果結果為0x1000,則表示喝咖啡是我的愛好
            
            //接收輸入
            System.out.println("請輸入對應數字:\n1.閱讀\n2.交際\n4.電影\n8.喝咖啡\n\n0.結束輸入\n");
            Scanner scanner = new Scanner(System.in);
            int input = scanner.nextInt();
            while(input != 0){
             status |= input;
             input = scanner.nextInt();
            }
            System.out.println("您輸入的結果計算后的二進制表示:" + Integer.toBinaryString(status));

            System.out.println("\n-----------------\n您的愛好有:");
            for (Hobby hobby : Hobby.values()) {
             if ((status & hobby.getFlag()) == hobby.getFlag()) {
              System.out.println(hobby);
             }
            }
           }

           public static void main(String[] args) {
            saveStatus();
           }
          }


          示例中用到的枚舉:

          package com.aptechb;

          public enum Hobby {
           閱讀(0x1), 交際(0x2), 電影(0x4), 喝咖啡(0x8);
           
           private int flag;
           
           private Hobby(int flag){
            this.flag = flag;
           }
           
           public int getFlag() {
            return flag;
           }
          }


          posted on 2010-01-29 17:36 李贊紅 閱讀(2131) 評論(1)  編輯  收藏

          評論

          # re: 使用二進制實現標志疊加[未登錄] 2010-02-01 14:12 Nicholas

          學習了,非常實用
          很多掩碼的實現都可以參考  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(12)

          隨筆檔案(28)

          相冊

          技術友情博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 荆门市| 梨树县| 彰化市| 阿拉尔市| 汤阴县| 昌黎县| 桦南县| 郑州市| 永泰县| 高淳县| 吕梁市| 宕昌县| 黄陵县| 内江市| 都江堰市| 巴东县| 铜鼓县| 故城县| 广元市| 河曲县| 沅陵县| 布尔津县| 岳阳县| 屯门区| 卓资县| 慈溪市| 新蔡县| 西青区| 鲜城| 翁牛特旗| 定襄县| 大连市| 甘孜| 永善县| 于田县| 门源| 蒲城县| 象州县| 林甸县| 本溪市| 麦盖提县|