位运算技巧

位运算技巧的总结

1. 位运算基础

  • 与(&)两个比特位同时为1结果为1,否则为0
  • 或(|)只要有一个为1结果就为1
  • 非(~) 取反
  • 异或(^)相同则为0,不同则为1。(像是消消乐)
  • 右移(>>)不包括符号位,整体右移,左边位补0,右边舍弃。大概相当于整除2的n次方。左移反之
  • 无符号右移(>>>) 包括符号位,整体右移。(-4 >>> 1 = 2147483646)
  • 原、反、补码:正数:原码=反码=补码 负数:反码=原码忽略符号位取反, 补码=反码+1

2. 位运算枚举

枚举值用二进制表示,可以进行一些高效的运算,源码中较常见,实例如下:

public class NewPermission {
    // 是否允许查询,二进制第1位,0表示否,1表示是
    public static final int ALLOW_SELECT = 1 << 0; // 0001

    // 是否允许新增,二进制第2位,0表示否,1表示是
    public static final int ALLOW_INSERT = 1 << 1; // 0010

    // 是否允许修改,二进制第3位,0表示否,1表示是
    public static final int ALLOW_UPDATE = 1 << 2; // 0100

    // 是否允许删除,二进制第4位,0表示否,1表示是
    public static final int ALLOW_DELETE = 1 << 3; // 1000

    // 存储目前的权限状态
    private int flag;

    /**
     *  重新设置权限
     */
    public void setPermission(int permission) {
        flag = permission;
    }

    /**
     *  添加一项或多项权限
     */
    public void enable(int permission) {
        flag |= permission;
    }

    /**
     *  删除一项或多项权限
     */
    public void disable(int permission) {
        flag &= ~permission;
    }

    /**
     *  是否拥某些权限
     */
    public boolean isAllow(int permission) {
        return (flag & permission) == permission;
    }

    /**
     *  是否禁用了某些权限
     */
    public boolean isNotAllow(int permission) {
        return (flag & permission) == 0;
    }

    /**
     *  是否仅仅拥有某些权限
     */
    public boolean isOnlyAllow(int permission) {
        return flag == permission;
    }
}

3. 交换两个值

void exchange(int x , int y) 
{ 
    x ^= y; 
    y ^= x; 
    x ^= y; 
} 

4. 判断奇偶性

void test(int x)
{
    if (x&1 == 0) {
        printf("偶数");
    } else {
        printf("奇数");
    }
}

5. 求平均值(避免超过int最大值溢出情况)

int average(int x, int y)   //返回X,Y 的平均值
{   
     return (x&y)+((x^y)>>1);
}

部分摘录自 这里,更多内容请点击链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容