每一个标志都使用一个以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;
}
}