位运算技巧

作者: sys_out | 来源:发表于2020-04-12 10:41 被阅读0次

    位运算技巧的总结

    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);
    }
    

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

    相关文章

      网友评论

        本文标题:位运算技巧

        本文链接:https://www.haomeiwen.com/subject/xsvumhtx.html