java面试之位运算(如何不通过第三方变量交换两个数字,效率最高的乘法运算)

class Demo2_Operator {
    public static void main(String[] args) {
        /*
        * 位异或运算符的特点

        * ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
        */

        //System.out.println(5 ^ 10 ^ 10);
        //System.out.println(5 ^ 10 ^ 5);

        /*
        * 请自己实现两个整数变量的交换(不需要定义第三方变量)
        * 注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
        */

        int x = 10;
        int y = 5;

        //需要第三方变量,开发推荐用这种
        /*int temp;
        temp = x;
        x = y;
        y = temp;*/

        //不需要定义第三方变量,有弊端,有可能会超出int的取值范围
        /*x = x + y;                //10 + 5 = 15
        y = x - y;                //15 - 5 = 10
        x = x - y;                //15 - 10 = 5*/

        //不需要第三方变量,通过^来做
        x = x ^ y;                // 10 ^ 5 
        y = x ^ y;                // 10 ^ 5 ^ 5    y = 10
        x = x ^ y;                // 10 ^ 5 ^ 10  x = 5

        System.out.println("x = " + x + ",y = " + y);
    }
}

效率最高的乘法运算

class Demo3_Operator {
    public static void main(String[] args) {
        /*
        *  <<:左移    左边最高位丢弃,右边补齐0
        *  >>:右移    最高位是0,左边补齐0;最高为是1,左边补齐1
        *  >>>:无符号右移 无论最高位是0还是1,左边补齐0
        *  最有效率的算出2 * 8的结果
        */

        //左移,向左移动几位就是乘以2的几次幂
        //System.out.println(12 << 1);        //24
        //System.out.println(12 << 2);        //48

        /*
        00000000 00000000 00000000 00001100        12的补码
     (0)0000000 00000000 00000000 000011000        24的补码
    (00)000000 00000000 00000000 0000110000        48的补码
        */

        //右移,向右移动几位就是除以2的几次幂
        //System.out.println(12 >> 1);
        //System.out.println(12 >> 2);

        /*
        00000000 00000000 00000000 00001100        12的补码
        000000000 00000000 00000000 0000110(0)    6
        0000000000 00000000 00000000 000011(00) 3
        */

        //最有效率的算出2 * 8的结果
        System.out.println(2 << 3);
    }
}

 

posted on 2017-05-25 11:21  平凡的小石头  阅读(259)  评论(0编辑  收藏  举报

导航