本文共 2478 字,大约阅读时间需要 8 分钟。
一直很想用位运算来写代码,奈何自己没有好好学习计算机基础,接下来想好好学习这些基础。现在先贴出一些常用的位运算,希望能对自己有点帮助!
//1.获得int型最大值void getMaxInt(){ int MaxInt1= (1 << 31) - 1;//由于优先级关系,括号不可省略 int MaxInt2=~(1<<31);//~是取反运算 int MaxInt3=(1 << -1) - 1;//部分编译器不支持 int MaxInt4=((unsigned int) - 1) >> 1;//不知道int占几个字节时候} //2.获得int型最小值void getMinInt(){ int MinInt1= 1 << 31;//-2147483648 int MinInt2= 1 << -1;//-2147483648,有些编译器不支持 } //3.获得long类型的最大值long getMaxLong(){ return ((unsigned long) - 1) >> 1;//2147483647 } //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.判断一个数的奇偶性bool isOddNumber(int n){ return (n & 1) == 1; } //9.不用临时变量交换两个数void swap(int *a,int *b){ (*a) ^= (*b) ^= (*a) ^= (*b); //}//9,不用临时变量交换两个数通用版void swap(int *a,int *b){ *a ^= *b; *b ^= *a; *a ^= *b; //分析 //*b=*b^*a,而此时的*a=*a^*b,所以*b=*a^*b^*b 因为异或运算,相关的位异或为0,所以*b^*b等于0,所以*b=*a; //同理可以得出*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就是绝对值 */ } //11.取两个数的最大值int max(int x,int y){ return x ^ ((x ^ y) & -(x < y)); //如果x= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。 } //14.计算2的n次方int getFactorialofTwo(int n){ //n > 0 return 2 << (n-1);//2的n次方 } //15.判断一个数是不是2的幂bool isFactorialofTwo(int n){ return n > 0 ? (n & (n - 1)) == 0 : false; } //16.对2的n次方取余int quyu(int m,int n){ //n为2的次方 return m & (n - 1); } //17.求两个整数的平均值int getAverage(int x, int y){ return (x + y) >> 1; }//18.从低位到高位,取n的第m位int getBit(int n, int m){ return (n >> (m-1)) & 1; } //19.从低位到高位.将n的第m位置1int setBitToOne(int n, int m){ return n | (1 << (m-1)); /*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/ } //20.从低位到高位,将n的第m位置0int setBitToZero(int n, int m){ return n & ~(1 << (m-1)); /* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/ } 21、清除n最右边的1:n&n-1当n为奇数,二进制表示的末位为1: n: xxxxxxxx1 n-1: xxxxxxxx0 n&(n-1): xxxxxxxx0 相当于去掉最右边的一个1。 当n为偶数且不等于0,二进制表示的末位为0: n: xxxxx1000 n-1: xxxxx0111 n&(n1-): xxxxx0000 相当于去掉最右边的一个1。 22、取得n最右边的1:n&-n-n的补码可以这样得到:找到n最右边出现的1,该位不变,然后这个1左边的所有位取反。那么n&-n等于得到刚刚那个1。
转载地址:http://aarvb.baihongyu.com/