位运算的效率是最高的,因为位位运算是直接对二进制进行操作

位运算只能应用于整型和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;

/*
判断一个数是否是奇数?
特点:最低位为1.
a & 1 == 1;
*/
class OperatorDemo1 {
public static void main(String[] args) {
int a = -2018;
// System.out.println(a % 2 == 1);
// System.out.println(a % 2 != 1);
System.out.println((a & 1) == 1);
}
}

b: 对2 ^ n 取余。 a & (2^n - 1);

/*
对2的n次幂取余,都可以转换成位运算。
2^n:
1101 1101
% 0100 0000 1101 1101
& 0011 1111 */
class OperatorDemo3 {
public static void main(String[] args) {
int a = 2019;
System.out.println(a % 64);
System.out.println(a & (64 - 1)); /*System.out.println(a % 78);
System.out.println(a & (78 - 1));*/
}
}

c: 如何判断一个数是否是2^n

a & (a-1) == 0;

/*
判断一个数是否是2的n次幂?
2^n:因子都是2;
时间复杂度:logn; 能否在常量时间复杂度内, 判断一个数是否是2的n次幂。
2^n的存储特点:只有一个1,后面全部是0.
(a & (a - 1)) == 0 0100 0000
& 0011 1111
0000 0000 0101 0000
& 0100 1111
0100 0000
*/ class OperatorDemo4 {
public static void main(String[] args) {
int a = 1024;
System.out.println((a & (a - 1)) == 0);
}
}

d: 两个整数之间的交换;

/*
面试题
两个整数变量的交换.
*/ class OperatorDemo5 {
public static void main(String[] args) {
// 方式一
/*int a = 4;
int b = 3;
System.out.println("a=" + a + ", b=" + b);
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a + ", b=" + b);*/ // 方式二
// 加法和减法互为逆运算。
/*int a = 4;
int b = 3;
System.out.println("a=" + a + ", b=" + b);
a = a + b; // a = 4 + 3, b = 3;
b = a - b; // a = 4 + 3, b = 4 + 3 - 3 = 4;
a = a - b; // a = 4 + 3 - 4 = 3, b = 4;
System.out.println("a=" + a + ", b=" + b);*/ // 方式三
/*int a = 4;
int b = 3;
System.out.println("a=" + a + ", b=" + b);
a = a ^ b; // a = 4 ^ 3, b = 3
b = a ^ b; // a = 4 ^ 3, b = 4 ^ 3 ^ 3 = 4;
a = a ^ b; // a = 4 ^ 3 ^ 4 = 3, b = 4;
System.out.println("a=" + a + ", b=" + b);*/ // 方式四
int a = 4;
int b = 3;
System.out.println("a=" + a + ", b=" + b);
/*a = a ^ b;
b = b ^ a;
a = a ^ b; */
// a ^= b ^= a ^= b;
a = (a ^ b) ^ (b = a); //工作中千万别这样写, 太show了。写代码,简洁易懂。
System.out.println("a=" + a + ", b=" + b);
}
}

e: 用最有效率的方式求2 * 8的值 2 << 3;

/*
<< 左移: 低位补0,高位丢弃
>> 右移: 高位补符号位, 低位丢弃
>>>无符号右移: 高位补0,低位丢弃 注意事项;
左移:左移n个单位,相当于乘以2^n;
右移: 右移n个单位,相当于除以2^n; 对于移位运算符来说,当操作数超出了字长时,实际移动 n mod 字长 个单位。 练习:
用最有效率的方式写出计算2乘以8的结果
2 << 3
*/ class OperatorDemo7 {
public static void main(String[] args) {
int a = 192;
System.out.println(a << 2); // 192 * 4 = 768
System.out.println(a >> 2); // 192 * 4 = 48
System.out.println(-a >> 2); // -192 * 4 = -48 System.out.println(a >>> 2);//
System.out.println(-a >>> 2); // 很大的整数 System.out.println("-----------------------");
a = 64;
System.out.println(a >>> 32);
System.out.println(a << 32);
System.out.println(a >> 32);
System.out.println(a >> 33);
System.out.println(a >> -31); }
} /*
192:
0000 0000 0000 0000 0000 0000 1100 0000
<< 2
0000 0000 0000 0000 0000 0011 0000 0000 192:
0000 0000 0000 0000 0000 0000 1100 0000
>> 2
0000 0000 0000 0000 0000 0000 0011 0000 -192:
1111 1111 1111 1111 1111 1111 0100 0000
>> 2
1111 1111 1111 1111 1111 1111 1101 0000 192:
0000 0000 0000 0000 0000 0000 1100 0000
>>> 2
0000 0000 0000 0000 0000 0000 0011 0000 -192:
1111 1111 1111 1111 1111 1111 0100 0000
>>> 2
0011 1111 1111 1111 1111 1111 1101 0000
*/

Java中关于位运算的面试题的更多相关文章

  1. Java中的位运算及简单的算法应用介绍

    众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对 ...

  2. Java中的位运算

    昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) ...

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

    通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标 ...

  4. java中的位运算及移位运算

    为了方便对二进制位进行操作,Java给我们提供了以下四个二进制位操作符: &    按位与 |     按位或 ^    按位异或 ~    按位取反 Java中有三个移位运算符: 左移:&l ...

  5. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  6. Java中的位掩码BitMask

    目录 JDK源码的使用 日常工作中的使用 JDK源码的使用 最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是 ...

  7. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  8. PHP中的位运算与位移运算(其它语言通用)

    /* PHP中的位运算与位移运算 ======================= 二进制Binary:0,1 逢二进1,易于电子信号的传输 原码.反码.补码 二进制最高位是符号位:0为正数,1为负数( ...

  9. Java中有关构造函数的一道笔试题解析

    Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...

随机推荐

  1. Eyoo大学生交友平台

    团队简介 团队名称 golden express 队员学号列表 王伟 201731062214 刘冬 201731062227 张旭 201731062129 秦裕航 201731062432 (组长 ...

  2. 201871010124王生涛第六七周JAVA学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://edu.cnblogs.com/campus/xbsf/ ...

  3. Hive学习之修改表、分区、列

    Hive学习之修改表.分区.列 https://blog.csdn.net/skywalker_only/article/details/30224309 https://www.cnblogs.co ...

  4. [LeetCode] 112. Path Sum 二叉树的路径和

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  5. 算法&设计模式

    这里更新Python 算法&设计模式部分的博客(或目录链接)

  6. JaCoCo覆盖率计数器

    覆盖率计数器 JaCoCo使用一组不同的计数器来计算覆盖率指标.所有这些计数器都是从Java类文件里获取信息,这些类文件包含Java 字节码指令和调试信息.即使没有可用源代码情况下,这种方法可以实时有 ...

  7. 雅礼集训 2017 Day4 编码(2-sat)

    题意 题目链接:https://loj.ac/problem/6036 思路 ​ 首先,有前缀关系的串不能同时存在,不难看出这是一个 2-sat 问题.先假设所有串都带问号,那么每一个字符串,我们可以 ...

  8. JAVA基础系列:内部类获取外部类的成员变量

    内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer { public String name = "outer"; c ...

  9. JMM与happens-before

    happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键. 一.JMM的设计 首先,让我们先分析一下JMM的设计意图.从JMM的设计者的角度,在设计JMM的 ...

  10. 使用mysqldump命令进行mysql数据库备份

    1.用法 mysqldump -uroot -p --databases test > /home/test.sql mysqldump -uroot -h127.0.0.1 -p --data ...