位运算的奇技淫巧

位运算的奇技淫巧


1.求一个数 n n n是奇数还是偶数?
解法:
让这个数和 1 1 1相与。(奇数为 1 1 1,偶数为 0 0 0


2. n n n个数(从 1 1 1 n n n)放入 n + 1 n+1 n+1的存储空间,只有一个元素重复,每个数据只能访问一遍,试找出重复元素为何?
解法:
根据异或“相同为0,不同为1”的特点。构造一个数据列1到n,将原始数据列和构造的数据列的所有元素异或取结果。由于重复的元素出现了三次,因此最终在所有元素两两消掉结果为0时,还剩下一个重复值。而0异或任何数都等于任何数,故结果直接求得。
简化思想:异或操作两两相消


3.输入一个数,输出该数的二进制表示中含有1的个数。
解法:

while(n){
	n = n & (n-1);
	cnt++;
}

原理:
n & ( n − 1 ) n\&(n-1) n&(n1)的操作可以 n n n的最低位的 1 1 1改为 0 0 0,因为当n的最低位为1时,n-1的最低位为0, 1 & 0 = 0 1\&0=0 1&0=0;
当n的最低位为0时,n-1的最低位为1,依靠的是借位操作,因此n中的最低位1被借变为0,而:
0 & n = 0 0\&n=0 0&n=0.


4.将一个十进制小数转化为二进制形式。
解法:
乘二取整,结果为0为止。


你可能感兴趣的:(《算法很美》)