zoukankan      html  css  js  c++  java
  • 必用位运算

    引述:

    • 使用位运算的两个优点 : 简单,效率高(计算机底层)
    • 简单记忆 : 清零取反用与,位置一用或 ,交换用疑惑

    参考: url

    1.获得int型最大值

    int getMaxInt(){  
            return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略  
    }  
    

    1.1另一种写法

    int getMaxInt(){  
        return ~(1 << 31);//2147483647  
    }  
    

    2.获得int型最小值

    int getMinInt(){  
        return 1 << 31;//-2147483648  
     }  
    

    2.1另一种写法

    int getMinInt(){//有些编译器不适用  
        return 1 << -1;//-2147483648  
    }
    
    

    3.获得long类型的最大值

    C语言版

    long getMaxLong(){  
        return ((unsigned long) - 1) >> 1;//2147483647  
    }  
    

    获得long最小值,和其他类型的最大值,最小值同理.

    4.乘以2运算

    int mulTwo(int n){//计算n*2   
        return n << 1;  //左移一位
    } 
    

    5.除以2运算

    int divTwo(int n){//负奇数的运算不可用  
        return n >> 1;//除以2  右移一位
    } 
    

    6.乘以2的m次方

    int mulTwoPower(int n,int m){//计算n*(2^m)  
        return n << m;  
    }
    

    7.除以2的m次方

    int divTwoPower(int n,int m){//计算n/(2^m)  
        return n >> m;  
    } 
    

    8.判断一个数的奇偶性

    boolean isOddNumber(int n){  
        return (n & 1) == 1;  
    } 
    
    1. swap 疑惑实现
    void swap(int *a,int *b){     
        (*a) ^= (*b) ^= (*a) ^= (*b);     
    } 
    

    10.取绝对值(某些机器上,效率比n>0 ? n:-n 高)

    int abs(int n){  
    return (n ^ (n >> 31)) - (n >> 31);  
    /* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1 
    若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算, 
    结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */  
    } 
    
    1. 取最大值MAX
    int max(int x,int y){  
        return x ^ ((x ^ y) & -(x < y));  
        /*如果x<y x<y返回1,否则返回0, 
    、 与0做与运算结果为0,与-1做与运算结果不变*/  
    } 
    

    12.判断一个数是不是2的幂

    boolean isFactorialofTwo(int n){  
        return n > 0 ? (n & (n - 1)) == 0 : false;  
        /*如果是2的幂,n一定是100... n-1就是1111.... 
           所以做与运算结果为0*/  
    }
    

    13.从低位到高位,取n的第m位

    int getBit(int n, int m){  
        return (n >> (m-1)) & 1;  
    }  
    

    14.从低位到高位.将n的第m位置1

    int setBitToOne(int n, int m){  
        return n | (1 << (m-1));  
        /*将1左移m-1位找到第m位,得到000...1...000 
          n在和这个数做或运算*/  
    }  
    

    15.从低位到高位,将n的第m位置0

    int setBitToZero(int n, int m){  
        return n & ~(1 << (m-1));  
        /* 将1左移m-1位找到第m位,取反后变成111...0...1111 
           n再和这个数做与运算*/  
    }
    
  • 相关阅读:
    freemarker的${!}
    什么是分布式消息中间件?
    Webservice工作原理及实例
    Nginx的一些基本功能
    dubbo与zookeeper的关系
    为什么推荐Zookeeper作注册中心
    ORACLE和MYSQL的简单区别
    SQL优化|Java面试题
    玩转 lua in Redis
    解决KafKa数据存储与顺序一致性保证
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8904147.html
Copyright © 2011-2022 走看看