巧妙运用二进制与位运算解决问题:
二进制中1的个数的两种方法:
1,当N某一位上为1时,1左移到该位时的数(1&1为1,1&0为0)刚好等于1<<i,说明有一个1
int count=0;
for (int i =o; i< 32; i++0){
if((N&(1<<i))==(1<<i)){
count++;
}
}
System.out.println( count);
2,当一个二进制数N每减一个1后,右数第一个1变成0后面所有数变成1,当它再与N进行与运算后会消掉后面的1
10100-1=10011,10011&10100=10000 。
count=0;
while (N!=O){
N=((N-1)&N);
count++;
}
System.ourt.println( count);
}
3,当判断整数是不是2的整数倍时,就相当于间接判断二进制里面1的个数是不是一个。
互换整数的奇偶位:
其实也是利用了与&运算与二进制,当一个二进制数&101010101010…相当于取出了偶数位,同理当一个数&010101010101…相当于取出奇数位。代码如下:
private static int m(int i) {
int ou = i&Pxaaaaaaaa;//1010101010....转换成16进制。
int ji = i&Dx55555555;//0101010101....的16进制。
return (ou>>1)^(ji<<1);
}
2013部分真题小结:
猜年龄 ,简单枚举
组素数带重复元素的全排列和素数判定,用到set去重。
马虎的算式, 利用枚举设5个变量,再组合。
第39级台阶,记录走的步数,本质是递归思维。
有理数类面向对象和分数加法。
逆波兰表达式递归的整体思维。