位运算符的一些用途

 

虽然平时很少用到位运算符,但是在某些时候,这些小东西确实能够给我们提供很好的解决方案。

 


概述

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

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]
    }
}

 

当然,除了以上两种应用外,位运算符应该还有很多的应用方法。期待中。

 



参考资料:

1. http://www.360doc.com/content/06/0803/20/8473_172708.shtml
2. http://hi.baidu.com/machh03/blog/item/2141e390bc91f785a977a4b8.html


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值