判断奇偶数
一般实际开发中遇到这样的问题,我们的处理情况大多如下:
for(n%2 == 1){
sout("n为奇数");
}
但是,BUT,下次你可以用位运算这种形式来一展你纯真的*格了。如下:
if(n & 1 == 1){
sout("n为奇数");
}
这样写的方式 时间效率也比较高(PS:无形装逼,最为致命)。
交换两个int
这个情形,应该在实际开发中遇到的机会比较多,所以,骚年,你准备好了吗?
一般我们都会构造一个私有的函数,比如:
private void swap(int x,int y){
int temp = x;
x = y;
y = temp;
}
BUT,面试的时候你可能会遇上这样的一道问题:
不允许你使用额外的辅助变量来完成两个int 的交换。
是不是顿时整懵逼了,这可咋整呀?如下:
private void swap(int x,int y){
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
是不是很amazing,是不是在你的印象中,异或(^)只是不进位的加法运算,没错,它就是你理解的不进位的加法运算符。
我们都知道,两个相同的数异或之后都会等于0.即 n ^ n = 0;而任何数与0异或,得到的都是本身,即 n ^ 0 = n。
这样,你就能推算出上面的过程了。
利用位运算,同样可以解决下面的问题:
给出a、b两个整数,求和,但是不能使用 + 等数学运算符号
int aplusb(int a, int b){
if((a&b) == 0){
return a|b;
}else {
return aplusb(a^b, (a&b)<<1);
}
}
给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数
int get(int[] arry){
int tmp = arry[0];
for(int i = 1;i < arry.length; i++){
tmp = tmp ^ arry[i];
}
return tmp;
}