之前在偶然看到这篇文章,看了一下,觉得挺不错的。今天突然想起,却找了好久才找到,所以想收藏在这,免得以后找不到。
Welcome To My Bit Tricks
- 获得int型最大值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int getMaxInt(){ return (1 << 31) - 1; }
另一种写法
int getMaxInt(){ return ~(1 << 31); }
另一种写法
int getMaxInt(){ return (1 << -1) - 1; }
C语言中不知道int占几个字节时候
int getMaxInt(){ return ((unsigned int) - 1) >> 1; }
|
- 获得int型最小值
1 2 3 4 5 6 7 8 9
| int getMinInt(){ return 1 << 31; }
另一种写法
int getMinInt(){ return 1 << -1; }
|
- 获得long类型的最大值
1 2 3 4 5 6 7 8 9 10 11 12 13
| C语言版
long getMaxLong(){ return ((unsigned long) - 1) >> 1; }
JAVA版
long getMaxLong(){ return ((long)1 << 127) - 1; }
获得long最小值,和其他类型的最大值,最小值同理.
|
- 乘以2运算
1 2 3
| int mulTwo(int n){ return n << 1; }
|
- 除以2运算
1 2 3
| int divTwo(int n){ return n >> 1; }
|
- 乘以2的m次方
1 2 3
| int mulTwoPower(int n,int m){ return n << m; }
|
- 除以2的m次方
1 2 3
| int divTwoPower(int n,int m){ return n >> m; }
|
- 判断一个数的奇偶性
1 2 3
| boolean isOddNumber(int n){ return (n & 1) == 1; }
|
- 不用临时变量交换两个数(面试常考)
1 2 3 4 5 6 7 8 9 10 11
| C语言版
void swap(int *a,int *b){ (*a) ^= (*b) ^= (*a) ^= (*b); }
通用版(一些语言中得分开写)
a ^= b; b ^= a; a ^= b;
|
- 取绝对值(某些机器上,效率比n>0 ? n:-n 高)
1 2 3 4 5 6 7
| int abs(int n){ return (n ^ (n >> 31)) - (n >> 31);
}
|
- 取两个数的最大值(某些机器上,效率比a>b ? a:b高)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 通用版
int max(int a,int b){ return b & ((a-b) >> 31) | a & (~(a-b) >> 31); }
C语言版
int max(int x,int y){ return x ^ ((x ^ y) & -(x < y));
}
|
- 取两个数的最小值(某些机器上,效率比a>b ? b:a高)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 通用版
int min(int a,int b){ return a & ((a-b) >> 31) | b & (~(a-b) >> 31); }
C语言版
int min(int x,int y){ return y ^ ((x ^ y) & -(x < y));
}
|
- 判断符号是否相同
1 2 3 4
| boolean isSameSign(int x, int y){ return (x ^ y) >= 0; }
|
- 计算2的n次方
1 2 3
| int getFactorialofTwo(int n){ return 2 << (n-1); }
|
- 判断一个数是不是2的幂
1 2 3 4 5
| boolean isFactorialofTwo(int n){ return n > 0 ? (n & (n - 1)) == 0 : false;
}
|
- 对2的n次方取余
1 2 3 4 5
| int quyu(int m,int n){ return m & (n - 1);
}
|
- 求两个整数的平均值
1 2 3 4 5 6 7 8 9 10 11
| int getAverage(int x, int y){ return (x + y) >> 1; }
另一种写法
int getAverage(int x, int y){ return ((x ^ y) >> 1) + (x & y);
}
|
下面是三个最基本对二进制位的操作
- 从低位到高位,取n的第m位
1 2 3
| int getBit(int n, int m){ return (n >> (m-1)) & 1; }
|
- 从低位到高位.将n的第m位置1
1 2 3 4 5
| int setBitToOne(int n, int m){ return n | (1 << (m-1));
}
|
- 从低位到高位,将n的第m位置0
1 2 3 4 5
| int setBitToZero(int n, int m){ return n & ~(1 << (m-1));
}
|
另附一些对程序效率上没有实质提高的位运算技巧,一些也是位运算的常识(面试也许会遇到)
1 2 3 4 5
| ~n + 1;
另一种写法
(n ^ -1) + 1;
|
- if(x == a) x = b; if(x == b) x = a;
- sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0
1
| return !!n - (((unsigned)n >> 31) << 1);
|