『你不知道的位运算,原来还可以这么用』

一、计算一个数的二进制表示中1的个数

一个十进制数字减1后,它的最低位的1位置变为0,,下一个位置变为1,所以把它的最低位的1变为0.(比如:数字6的二进制表示是00000110,数字5的二进制表示是00000101,进行一次操作,两个数字按位相与之后就变为00000100,数字6的二进制表示中1的个数就减少一个)

int countOf_1(int num){int ans = 0;while(num){num &= num – 1;ans++;}return ans;}

二、判断一个数是不是2的n次方

判断一个数是不是2的n次方,即判断一个数的二进制位的最高位是不是1,且只有一个

bool is_2Power(int num){num &= num – 1;return num == 0;}

三、整数n可以经过多少次变化变成m(指改变多少二进制位)int countChange(int n, int m){return countOf_1(n ^ m);//调用第一个函数}

四、获得最大、最小的int值pair<int, int> getLimitInt(){pair<int, int> p;p.first = ~(1 << 31);//int最大值p.second = 1 << 31;//int最小值return p;}

五、判断一个数的奇偶性

判断一个数是否为奇数即判断一个数的二进制表示中最低位是否为1

bool isOdd(int num){return num & 1 == 1;}

六、交换两个数的值

十进制中交换两个数a, b的值可以这样:a = a + b; b = a – b; a = a – b; 类似,二进制中可以用异或操作:a = a ^ b; b = a ^ b; a = a ^ b;

void swap(int a, int b){a ^= b ^= a ^= b;return ;}

七、求两个数的平均值int getAverage(int m, int n){return (m + n) >> 1;}

八、求倒数第m位的值int getMthN(int n, int m){return (n >> (m – 1)) & 1;}

九、把倒数第m位设置为1void setMthN_1(int n, int m){n |= (1 << (m – 1));return ;}

十、把倒数第m位设置为0

void setMthN_0(int n, int m){n &= ~(1 << (m – 1));return ;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

总结失败的原因能够让人越来越谨慎。

『你不知道的位运算,原来还可以这么用』

相关文章:

你感兴趣的文章:

标签云: