您的位置:首页 > 职场人生

小博老师解读经典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 位运算 面试题