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

位运算只能应用于整型和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. 16、基于状态的iptable+高级路由(重点)

    --   基于状态的iptables   如果按照tcp/ip来划分连接状态,有12种之多 但iptables里只有4种状态:ESTABLISHED.NEW.RELATED及INVALID   这两个 ...

  2. ArrayList对象声明& arrayList.size()

    此程序用于测试 :每次for循环内重新定义一个Integer数组,赋值后加入arrayList.由于下一次的Integer对象重新定义,原来的对象是否会被释放? 解答:不会,因为原对象仍被引用(被ar ...

  3. v8/src/compilation-statistics.cc pdfium编译

    v8/src/compilation-statistics.cc:18:3: 警告:‘auto’ changes meaning in C++11; please remove it [-Wc++0x ...

  4. 201871010123-吴丽丽《面向对象程序设计(Java)》第十五周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  5. 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结

    201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. nginx源码安装与使用

    [root@localhost ~]# yum -y install pcre-devel zlib-devel openssl openssl-devel gcc* [root@localhost ...

  7. VLDB 2019:

    纵览数据库顶会VLDB 2019论文,我们发现了六大发展动向 作者 | 韩硕 [导读]一年一度的数据库领域顶级会议 VLDB 2019 于当地时间8月26日-8月30日在美国加利福尼亚州洛杉矶召开,探 ...

  8. String的拼接

    1.直接定义字符串变量的时候赋值,如果表达式右边只有字符串常量,那么就是把变量存放在常量池里面. 2.new出来的字符串是存放在堆里面. 3.对字符串进行拼接操作,也就是做"+"运 ...

  9. ORB-SLAM2初步

    一.ORB-SLAM简介 最近开始入坑SLAM,经过简单调研,各位大咖认为,目前最优秀的视觉SLAM系统是ORB-SLAM2,因此对ORB-SLAM2进行了学习. ORB-SLAM2是2015年提出的 ...

  10. 解决Windows更新错误0x80240034

    Windows update错误0x80240034 笔者平台:WIn10预览版 微软官方文档: https://support.microsoft.com/en-us/help/929833/use ...