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 李贊紅 閱讀(2134) 評論(1)  編輯  收藏

          評論

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

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


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


          網站導航:
           

          導航

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

          統計

          常用鏈接

          留言簿(12)

          隨筆檔案(28)

          相冊

          技術友情博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 滦平县| 桂阳县| 石景山区| 咸宁市| 海宁市| 隆化县| 宁城县| 安岳县| 铅山县| 辛集市| 五河县| 民县| 景泰县| 灵石县| 固阳县| 兰西县| 宜章县| 绍兴市| 大同县| 康乐县| 桂林市| 绥芬河市| 拜泉县| 云龙县| 全南县| 秭归县| 石景山区| 双峰县| 庆城县| 莒南县| 乌苏市| 红原县| 吉木乃县| 明水县| 义马市| 册亨县| 三都| 崇仁县| 肥城市| 平南县| 安龙县|