首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java位演算在程序设计中的使用:位掩码(BitMask)

2013-09-15 
Java位运算在程序设计中的使用:位掩码(BitMask)在Java中,位运算符有很多,例如与(&)、非(~)、或(|)、异或(^)、

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




热点排行