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 李赞红 阅读(2125) 评论(1)  编辑  收藏

评论

# re: 使用二进制实现标志叠加[未登录] 2010-02-01 14:12 Nicholas

学习了,非常实用
很多掩码的实现都可以参考  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

导航

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

统计

常用链接

留言簿(12)

随笔档案(28)

相册

技术友情博客

搜索

最新评论

阅读排行榜

评论排行榜