packageBinary;public classBinaryTag {static classGoods {privateString name;private inttag;publicGoods() {}public Goods(String name, inttag) {this.name =name;this.tag =tag;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetTag() {returntag;
}public void setTag(inttag) {this.tag =tag;
}
}classTag {public final static int None = 0; //没有标记
public final static int All = -1; //全部标记 1111 …… 1111
public final static int Promotion = 1; //促销标记 0001
public final static int Genuine = 2; //正品标记 0010
public final static int Double11 = 4; //双十一 0100
public final static int Double12 = 8; //双十二 1000
}/***@paramargs*/
public static voidmain(String[] args) {
Goods nike= new Goods("Nike", Tag.None);
System.out.print("标为正品;");
mark(nike, Tag.Genuine);
System.out.print("参加促销;");
mark(nike, Tag.Promotion);
System.out.print("参加双十一;");
mark(nike, Tag.Double11);
System.out.println("不参加双十二;");
clearMark(nike, Tag.Double12);
descGoods(nike);
System.out.println("不促销了,也不参加双十一了;");
clearMark(nike, Tag.Promotion+Tag.Double11);
descGoods(nike);
System.out.println("反转双十一和双十二的标记;");
reverseMark(nike, Tag.Double11+Tag.Double12);
descGoods(nike);
System.out.println("反转双十一和双十二的标记;");
reverseMark(nike, Tag.Double11+Tag.Double12);
descGoods(nike);
System.out.println("添加全部标记;");
markAll(nike);
descGoods(nike);
System.out.println("清除所有标记;");
clearAllMark(nike);
descGoods(nike);
}/*** 添加某种标记
*@paramgoods
*@paramtag*/
public static void mark(Goods goods, inttag) {int oldTag =goods.getTag();//将tag位 置为1 引用 [2.2) 1 | R = 1; 0 | R = R; R | R = R;]
int newTag = (oldTag |tag);
goods.setTag(newTag);
}/*** 打上所有的标记
*@paramgoods*/
public static voidmarkAll(Goods goods) {
goods.setTag(Tag.All);
}/*** 消除商品tag
*@paramgoods
*@paramtag*/
public static void clearMark(Goods goods, inttag) {int oldTag =goods.getTag();int newTag = (oldTag & (~tag));
goods.setTag(newTag);
}/*** 消除全部标记
*@paramgoods*/
public static voidclearAllMark(Goods goods) {
goods.setTag(Tag.None);
}/*** 对指定标记进行反转
*@paramgoods
*@paramtag*/
public static void reverseMark(Goods goods,inttag) {int oldTag =goods.getTag();int newTag = (oldTag ^tag);
goods.setTag(newTag);
}/*** 是否打了这种标记
*@paramgoods
*@paramtag
*@return
*/
public static boolean isTaged(Goods goods, inttag) {int oldTag =goods.getTag();return tag == (oldTag &tag);
}public static voiddescGoods(Goods goods) {
System.out.print(goods.getName()+":");
System.out.print((isTaged(goods, Tag.Promotion)?"":"不") + "参加促销;");
System.out.print((isTaged(goods, Tag.Genuine)?"":"不") + "是正品;");
System.out.print((isTaged(goods, Tag.Double11)?"":"不") + "参加双十一;");
System.out.print((isTaged(goods, Tag.Double12)?"":"不") + "参加双十二;");
System.out.println("\n");
}
}