java--运算大法

2019-05-28  本文已影响0人  话尔loony

判断奇偶数

一般实际开发中遇到这样的问题,我们的处理情况大多如下:

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;
}

上一篇 下一篇

猜你喜欢

热点阅读