位运算符的一些用途

概述

位运算是对二进制数进行运算。

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

猜你喜欢

转载自lirenjiede.iteye.com/blog/1505774