位运算实现普通运算(可能是负优化,建议自己测试比较速度后再考虑使用)
1,一个数乘2的若干次幂
1 x*=2 -------> x<<=1 2
2 x*=64 -------> x<<=6
2,一个除以乘2的若干次幂
1 x/=2 -----------> x>>=1
3,浮点数转整数
1 x=int(114.514) ---------> x=114.514>>0
4,符号取反
1 x=-x -------> x=~x + 1
或
1 x=(x^ -1) +1
5,取余数,如果除数为2的若干次幂
1 x=114514%8 --------> x=114514&(8-1)
6,交换两个数(没有iosteam里面的swap快)
1 #define swap(x,y) x ^= y ^= x ^= y;
7,max(大数据不快)
1 #define max(x,y) y & ((x - y) >> 31) | x & (~(x - y) >> 31);
8,min(大数据不快)
1 #define min(x,y) x & ((x - y) >> 31) | y & (~(x - y) >> 31);
9,判断两非零实数是否相同(有0的情况是例外)
1 bool is_same_sign(int x, int y)
2 {
3 return (x ^ y) >= 0;
4 }
10,绝对值
1 #define abs(x) (x ^ (x >> 31)) - (x >> 31);
11,判断一个数是否是2的非负整数次幂
1 bool is_the_power_of_two(int x)
2 {
3 return x > 0 && (x & (x - 1)) == 0;
4 }
12,对2的非负整数次幂取模
1 int mod_the_power_of_two(int x, int mod)
2 {
3 return x & (mod - 1);
4 }
13,取x的二进制第y位,最低为从第0位算起
1 int get_bit(int x, int y)
2 {
3 return (x >> y) & 1;
4 }
14,将x二进制第y位设为1,最低为从第0位算起
1 int change_bit_to_1(int x, int y)
2 {
3 return x | (1 << y);
4 }
15,将x二进制第y位设为0,最低为从第0位算起
1 int change_bit_to_0(int x, int y)
2 {
3 return x & ~(1 << y);
4 }
16,将x二进制第y位取反,最低为从第0位算起
1 int flap_bit(int x, int y)
2 {
3 return x ^ (1 << y);
4 }