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);
    }
}
时间: 2024-08-04 21:43:56

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

【Java】不使用第三方变量交换两个变量的值

在语言学习和进行程序设计的时候,我们交换两个变量最常使用的方法是借助temp这个新的变量进行转换,代码如下: ----------------------------------------- <--标准算法--> ----------------------------------------- int a = 3, b = 4; int temp = a; a = b; b = temp; ----------------------------------------- 这种方法易于理解

Java不借助第三方变量交换两个变量的值

这种方式有个隐患,如果两个数相加超过了类型的上限,会影响精度,导致结果不准确: public class Test { public static void main(String[] args) { int i=1; int j=3; i=i+j; j=i-j; i=i-j; System.out.println(i+","+j); } } 使用位^运算符就不会出现上面的情况 public class Test001 { public static void main(String[

java中的位运算

刚才在imooc看php基础发现一个特别容易让我们理解的描述[关于异或运算的] 之前学习java的时候 位运算有4种,当时是这样记录的: &  按位与 (and) 两个对应二进制都为1则为1,其余全为0 |   按位或(or) 两个二进制数有一个为1则为1,只有两个0才为0 ~  按位非(NOT) 二进制中取反 ^  按位异或(XOR) 两个二进制中相同为则为0,不同则为1             其实最难以理解的就是这个异或运算. 直接搬过来(原网址点我): 我们可以从投票的角度来理解逻辑运算

在 Java 中不使用多余变量交换两个字符串

在 Java 中不使用多余变量交换两个字符串 public class Test { public static void main(String[] args) { String a = "Hello"; String b = "World"; System.out.println("Strings before swap: a = " + a + " and b = " + b); a = a + b; b = a.sub

java中通过位运算实现多个状态的判断

通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标记 */ short COST_ASSET = 1 << 0; short COST_GOLD = 1 << 1; short COST_BINDGOLD = 1 << 2; short COST_SOPH = 1 << 3; short COST_STRSOU

Java笔记:位运算

一.数据存储 二进制数在内存中以补码的形式存放.正数的反码.补码均为本身.负数的反码为符号位不变且其余位取反,补码为反码+1. 二.位运算 ①按位取反:反转操作数中的所有位. ②按位与:仅当两个操作数都是1,结果为1.否则为0. ③按位或:只要有一个操作数是1,结果为1.否则为0. ④按位异或:只有一个操作数是1,结果为1.否则为0. ⑤左移:将不包括符号位的所有数值向左移动指定次数,右边补充0.每左移一位相当于*2. ⑥右移:将不包括符号位的所有数值向右移动指定次数,左边补充0.每右移一位相当

Java负数的位运算

/** * 求负数的位运算 *///1. -10 >> 2 = ?//2. -10的原码: 1000 0000 0000 0000 0000 0000 0000 1010 最高位代表符号位//3. -10的反码: 1111 1111 1111 1111 1111 1111 1111 0101 符号为不变,其他位相反//4. -10的补码:1111 1111 1111 1111 1111 1111 1111 0110 补码为反码加1//5. 补码右移2为:1111 1111 1111 1111

Java 基础 之 位运算

http://www.verejava.com/?id=16992602784016 public class Operation5 { public static void main(String[] args) { //位运算 /* 包括: 与 &, 或 |, 取反 ~, 异或 ^ 带符号左移<<, 带符号右移 >>, 无符号右移 >>> 1. & 就是二进制位如果都是1则为1,否则为0 2. | 就是二进制位如果都是0则为0,否则为1 3.

Java中关于位运算的面试题

位运算的效率是最高的,因为位位运算是直接对二进制进行操作 位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形) 面试题: a: 判断一个数是否是奇数 a & 1 == 1; b: 对2 ^ n 取余. a & (2^n - 1); c: 如何判断一个数是否是2^n a & (a-1) == 0: d: 两个整数之间的交换: e: 用最有效率的方式求2 * 8的值 2 << 3; a: 判断一个数是否是奇数 a & 1 == 1; /*