小博老师解读经典Java面试题—Java位运算

来源:互联网 发布:钱塘大数据交易平台 编辑:程序博客网 时间:2024/05/29 18:48

[面试原题]

我们经常会看到类似于下面这样的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,内存中任何一个数据都是用单位存储的,位运算就是对内存中的单位进行的直接计算,其效率要远高于运算符(运算符先要把数据调到缓冲区后才能进行操作)。


0 0
原创粉丝点击