古明地こいし

导航

位运算实现普通运算(可能是负优化,建议自己测试比较速度后再考虑使用)

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 }

 

posted on 2021-11-16 16:36  古明地こいし  阅读(40)  评论(0编辑  收藏  举报