位运算的奇技淫巧
1.求一个数nnn是奇数还是偶数?
解法:
让这个数和111相与。(奇数为111,偶数为000)
2.nnn个数(从111到nnn)放入n+1n+1n+1的存储空间,只有一个元素重复,每个数据只能访问一遍,试找出重复元素为何?
解法:
根据异或“相同为0,不同为1”的特点。构造一个数据列1到n,将原始数据列和构造的数据列的所有元素异或取结果。由于重复的元素出现了三次,因此最终在所有元素两两消掉结果为0时,还剩下一个重复值。而0异或任何数都等于任何数,故结果直接求得。
简化思想:异或操作两两相消
3.输入一个数,输出该数的二进制表示中含有1的个数。
解法:
while(n){
n = n & (n-1);
cnt++;
}
原理:
n&(n−1)n\&(n-1)n&(n−1)的操作可以将nnn的最低位的111改为000,因为当n的最低位为1时,n-1的最低位为0,1&0=01\&0=01&0=0;
当n的最低位为0时,n-1的最低位为1,依靠的是借位操作,因此n中的最低位1被借变为0,而:
0&n=00\&n=00&n=0.
4.将一个十进制小数转化为二进制形式。
解法:
乘二取整,结果为0为止。