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