经常有一个对象都是有一个Int类型的字段,用于给该对象进行打标。 一个int类型是32位, 就说明 这样的一个字段,可以被打上32个标 。 每一个标占1位 。 0表示未被打标,1表示已被打标。
写了一个Util来进行打标与去标操作。如下:
public class FlagBitUtil {
public static final int FULL_FLAG = 0XFFFFFFFF ;
/**
* 打标
* @param falg 需要打标的源数
* @param offset 标位
*/
public static int sign(int flag , int offset){
int offsetT = 1 << ( offset - 1);
return flag | offsetT ;
}
/**
* 去标
* @param falg 需要移除标的源数
* @param offset 标位
*/
public static int removeSign(int flag , int offset){
int offsetT = 1 << ( offset - 1);
offsetT = FULL_FLAG ^ offsetT ;
return flag & offsetT ;
}
/**
* 检查标位是否被打标
* @param flag
* @param offset 标位
* @return 该标位是否被打标
*/
public static boolean checkSign(int flag , int offset){
int offsetT = 1 << ( offset - 1);
return (flag & offsetT) == offsetT ;
}
}
测试如下:
public class Test {
public static void main(String[] args) {
int flag = 0 ; //原始标
flag = FlagBitUtil.sign(flag, 3); //将标的第3位标记
System.out.println(flag + "\t" + Integer.toBinaryString(flag));
flag = FlagBitUtil.sign(flag, 4); //将标的第4位标记
System.out.println(flag + "\t" + Integer.toBinaryString(flag));
flag = FlagBitUtil.removeSign(flag, 3) ; //将标的第3位标记移除
System.out.println(flag + "\t" + Integer.toBinaryString(flag));
//检查第1、2、3、4、5位是否被打标
System.out.println(FlagBitUtil.checkSign(flag, 1));
System.out.println(FlagBitUtil.checkSign(flag, 2));
System.out.println(FlagBitUtil.checkSign(flag, 3));
System.out.println(FlagBitUtil.checkSign(flag, 4));
System.out.println(FlagBitUtil.checkSign(flag, 5));
}
}
输出:
4 100
12 1100
8 1000
false
false
false
true
false