Java位运算在程序设计中的使用:位掩码(BitMask)
在Java中,位运算符有很多,例如与(&)、非(~)、或(|)、异或(^)、移位(<<和>>)等。这些运算符在日常编码中很少会用到。
在下面的一个例子中,会用到位掩码(BitMask),其中包含大量的位运算。不只是在Java中,其他编写语言中也是可以使用的。
例如,在一个系统中,用户一般有查询(Select)、新增(Insert)、修改(Update)、删除(Selete)四种权限,四种权限有多种组合方式,也就是有16中不同的权限状态(2的4次方)。
一般情况下会想到用四个boolean类型变量来保存:
Permission.java
flag删除修改新增查询 1(0001)0001只允许查询(即等于ALLOW_SELECT)2(0010)0010只允许新增(即等于ALLOW_INSERT)4(0100)0100只允许修改(即等于ALLOW_UPDATE)8(1000)1000只允许删除(即等于ALLOW_DELETE)3(0011)0011只允许查询和新增00000四项权限都不允许15(1111)1111四项权限都允许...等等,不一一列举。
使用位掩码的方式,只需要用一个大于或等于0且小于16的整数即可表示所有的16种权限的状态。此外,还有很多设置权限和判断权限的方法,用到了很多位运算,例如
public static final int WEB_URLS = 0x01;public static final int EMAIL_ADDRESSES = 0x02;public static final int PHONE_NUMBERS = 0x04;public static final int MAP_ADDRESSES = 0x08;public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES;public static final boolean addLinks(Spannable text, int mask) { if (mask == 0) { return false; } URLSpan[] old = text.getSpans(0, text.length(), URLSpan.class); for (int i = old.length - 1; i >= 0; i--) { text.removeSpan(old[i]); } ArrayList<LinkSpec> links = new ArrayList<LinkSpec>(); if ((mask & WEB_URLS) != 0) { gatherLinks(links, text, Patterns.WEB_URL, new String[] { "http://", "https://", "rtsp://" }, sUrlMatchFilter, null); } if ((mask & EMAIL_ADDRESSES) != 0) { gatherLinks(links, text, Patterns.EMAIL_ADDRESS, new String[] { "mailto:" }, null, null); } if ((mask & PHONE_NUMBERS) != 0) { gatherLinks(links, text, Patterns.PHONE, new String[] { "tel:" }, sPhoneNumberMatchFilter, sPhoneNumberTransformFilter); } if ((mask & MAP_ADDRESSES) != 0) { gatherMapLinks(links, text); } pruneOverlaps(links); if (links.size() == 0) { return false; } for (LinkSpec link: links) { applyLink(link.url, link.start, link.end, text); } return true;}
作者:叉叉哥 转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/11701893