小博老师解读经典Java面试题—Java位运算
2016-10-25 16:09
387 查看
[面试原题]
我们经常会看到类似于下面这样的Java面试题:
请编写出效率最高的2乘以8的运算结果。
[正确答案]
2<<3
[面试技术点]
面试者是否了解、灵活运用java位运算技术。
面试者是否了解移位的速度要比算法快很多。
[步骤解读一]
小博老师首先为大家解读一下,什么是Java中的位运算。我们可以将Java中的位运算直观地理解为,对二进制数据进行的运算方式。比较常见的有移位、与位、或位、异或位等运算方式。
上述面试题考的就是面试者是否了解Java位运算中的移位。
我们首先来看一段代码:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
/* 2 的二进制数据 0010
* << 表示二进制数据向左移位
* 1 表示移位的步长
* */
System.out.println( 2<<1 );
/*
* 2 << 1 表示将2的二进制数据向左移位1次
* 0010 向左移位1次后变为 0100,也就是4
* */
由此可见,<<是向左移位符。2<<1表示的含义是将2的二进制数据,也就是0010,向左移位一次,变成了0100,也就是4。同理我们推算2<<2则应该表示将2的二进制数据0010向左移位2次,变成1000,也就是8。2<<3则应该表示将2的二进制数据0010向左移位3次,变成10000,也就是16。
我们编写代码并且运行验证小博老师的猜测:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
System.out.println( 2<<1 );
// 4
System.out.println( 2<<2 ); // 8
System.out.println(2<<3 );
// 16
由此我们可以看出规律,移位是对二进制数据进行的操作,因此左移位1次相当于就是将原值乘以2,左移位2次相当于就是将原值乘以4,左移位3次相当于就是将原值乘以8,也就是说,左移位n次相当于将原值乘以2的n次方。
我们回到文章开头的面试题,2乘以8的运算结果,我们可以解读为计算2乘以2的3次方的结果,因此就是2<<3。
同理,右移位应该就是使用>>运算符,编写程序验证:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
System.out.println( 64>>1 );
//32
System.out.println( 64>>2 ); // 16
System.out.println(64>>3 );
// 8
[步骤解读二]
至于为什么说2<<3的效率要高于2*8,这两者的核心区别在于移位(<<)的效率要高于运算符(*)。计算机采用二进制数据存储,只有1和0,内存中任何一个数据都是用单位存储的,位运算就是对内存中的单位进行的直接计算,其效率要远高于运算符(运算符先要把数据调到缓冲区后才能进行操作)。
我们经常会看到类似于下面这样的Java面试题:
请编写出效率最高的2乘以8的运算结果。
[正确答案]
2<<3
[面试技术点]
面试者是否了解、灵活运用java位运算技术。
面试者是否了解移位的速度要比算法快很多。
[步骤解读一]
小博老师首先为大家解读一下,什么是Java中的位运算。我们可以将Java中的位运算直观地理解为,对二进制数据进行的运算方式。比较常见的有移位、与位、或位、异或位等运算方式。
上述面试题考的就是面试者是否了解Java位运算中的移位。
我们首先来看一段代码:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
/* 2 的二进制数据 0010
* << 表示二进制数据向左移位
* 1 表示移位的步长
* */
System.out.println( 2<<1 );
/*
* 2 << 1 表示将2的二进制数据向左移位1次
* 0010 向左移位1次后变为 0100,也就是4
* */
由此可见,<<是向左移位符。2<<1表示的含义是将2的二进制数据,也就是0010,向左移位一次,变成了0100,也就是4。同理我们推算2<<2则应该表示将2的二进制数据0010向左移位2次,变成1000,也就是8。2<<3则应该表示将2的二进制数据0010向左移位3次,变成10000,也就是16。
我们编写代码并且运行验证小博老师的猜测:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
System.out.println( 2<<1 );
// 4
System.out.println( 2<<2 ); // 8
System.out.println(2<<3 );
// 16
由此我们可以看出规律,移位是对二进制数据进行的操作,因此左移位1次相当于就是将原值乘以2,左移位2次相当于就是将原值乘以4,左移位3次相当于就是将原值乘以8,也就是说,左移位n次相当于将原值乘以2的n次方。
我们回到文章开头的面试题,2乘以8的运算结果,我们可以解读为计算2乘以2的3次方的结果,因此就是2<<3。
同理,右移位应该就是使用>>运算符,编写程序验证:
// 博为峰 BWF
全栈Java课程
// JavaSE课程模块
// 运算符章节 ->
位运算
System.out.println( 64>>1 );
//32
System.out.println( 64>>2 ); // 16
System.out.println(64>>3 );
// 8
[步骤解读二]
至于为什么说2<<3的效率要高于2*8,这两者的核心区别在于移位(<<)的效率要高于运算符(*)。计算机采用二进制数据存储,只有1和0,内存中任何一个数据都是用单位存储的,位运算就是对内存中的单位进行的直接计算,其效率要远高于运算符(运算符先要把数据调到缓冲区后才能进行操作)。
相关文章推荐
- 小博老师解读经典Java面试题 ——Java位运算
- 小博老师解析经典Java面试题-redirect和forward的区别
- 小博老师解析Java经典面试题 ——常见Http状态号
- 小博老师解析经典Java面试题-&与&&运算符
- 小博老师解析经典Java面试题-redirect和forward的区别
- 小博老师解析经典Java面试题-&与&&运算符
- 小博老师收集Java经典面试题 ——Servlet和JSP常见面试题
- 小博老师解析Java经典面试题 ——常见Http状态号
- JAVA经典面试题
- 一道经典的Java面试题,抛析内部结构
- 经典java面试题
- java经典面试题
- 32道经典java面试题
- 一道经典的JAVA面试题
- java 经典面试题
- 一道经典的JAVA面试题
- java经典算法面试题(1)
- 一道经典的Java面试题--你会吗?
- Java经典面试题
- java经典面试题