概述
位运算是对二进制数进行运算。
java中的位运算符有[&, |, ^, ~, <<, >>, >>>],其中[~]是一元运算符,其余为二元运算符,二元运算符还有相应的赋值运算操作符[&=, |=, ^=, >>=, >>>=, <<=]。
java中,位运算的操作数只能为整型,布尔型和字符型。根据占用的字节数由小到大分别为:boolean, byte, char, short, int, long。
用途
用途之一:计算
既然是运算符,首要功能当然是运算了。使用位运算符进行运算,会在很多时候给我们带来不可思议的便利。
如:左移一位相当于除以2;右移一位相当于除以2。
用途之二:flag
由于位运算符都是对二进制数进行运算,所以我们也可以利用这一点来做为区分各种不同情况的flag。
下列代码就是一个简单的示例应用。对于一个java文件来说,它有以下几种 modifier:[public, package, protected, private, static, abstract, final]等等。这些modifier中,有些是可以同时存在的(如:public和static),有些则是互斥的,也就是说只能出现一种 (如:public和private)。
那么我们就可以对这些modifier进行分类,分类的方法就是让它们每一个都 占据一个二进制位。下列代码中,public占据了低位第一个二进制位,而private则占据了低位第4个二进制位。使用这种分类方法,我们就可以很轻 松的判断是否包含某一个modifier,也可以判断是否包含一系列modifier。如下列代码中的isPublic(int)和 hasModifier(int)。
这种用法还可以用在权限管理系统,因为权限系统也会有这种类似的部分可以同时具有,部分必须是互斥的需求。
package bit;
public class ModifierBase {
public static int PUBLIC = 0x0001;
public static int PACKAGE = 0x0002;
public static int PROTECTED = 0x0004;
public static int PRIVATE = 0x0008;
public static int STATIC = 0x0010;
public static int ABSTRACT = 0x0020;
public static int FINAL = 0x0040;
private int modifier = 0;
public ModifierBase(int modifier) {
this.modifier = modifier;
}
public boolean isPublic() {
return (this.modifier & PUBLIC) != 0;
}
public boolean isPackage() {
return (this.modifier & PACKAGE) != 0;
}
public boolean isProtected() {
return (this.modifier & PROTECTED) != 0;
}
public boolean isPrivate() {
return (this.modifier & PRIVATE) != 0;
}
public boolean hasModifier(int modifier) {
return (this.modifier & modifier) == modifier;
}
public boolean hasnotModifier(int modifier) {
return (this.modifier & modifier) == 0;
}
public static void main(String[] args) {
int modifiers1 = PUBLIC | PROTECTED;
int modifiers2 = PUBLIC | PROTECTED | PRIVATE;
ModifierBase base = new ModifierBase(modifiers2); // base is [PUBLIC | PROTECTED | PRIVATE]
System.out.println(base.hasModifier(modifiers1)); // true because base includes [PUBLIC | PROTECTED]
ModifierBase base2 = new ModifierBase(modifiers1); // base is [PUBLIC | PROTECTED]
System.out.println(base2.hasModifier(modifiers2)); // fasle because base2 donot includes [PRIVATE]
}
}
原文引自http://blog.csdn.net/superbeck/article/details/5387476