微信推送上看了一个Java面试题,文章的作者说可能是最简单的面试题了,题目就是判断一个数是否是奇数。
作者一开始指出大多数人会这样做
public boolean isOdd(int i) {
if( i % 2 == 1 ) {
System.out.println("是奇数");
} else {
System.out.println("是偶数");
}
}
编译的时候发现错误,有了这种写法:
public boolean isOdd(int i) {
if( i % 2 ==1 ) {
return true;
} else {
return false;
}
}
后来指出**if( i%2 == 1)**括号中的条件是一个什么类型呢?
就有了这种写法
public boolean isOdd(int i) {
return i % 2 ==1;
}
随后作者又提出了一个问题,如果传入的i是一个负数呢?
于是就有了这种写法
public boolean isOdd( int i ) {
return i % 2 == 1 || i % 2 == -1;
}
进一步优化是这样
public boolean isOdd( int i ) {
return i % 2 != 0;
}
最后作者给出了更加好的写法,使用位运算和==按位与运算符&==来进行奇数的判断
public boolean isOdd( int i ) {
return i >> 1 << 1 = i;
}
public boolean isOdd( int i ) {
return i &1 == 1;
}
对算法一窍不通的我用这两种方式试了一下,也算是理解了它们的用法:
package indi.zhaoxwf.base;
/**
* 位运算时先右移一位可以舍掉二进制的个数位
* 如果是奇数,再左移一位会舍掉二进制个数位的1
* 如果是偶数,原数字会保持不变
*
* 按位与操作会取相同的位数作为最终的值
*/
import java.util.Scanner;
public class BitewiseOper {
public static void main(String[] args) {
Scanner sc;
while(true) {
sc = new Scanner(System.in);
int x = sc.nextInt();
int y = x>>1;
int z = y<<1;
int a = x & 1;
System.out.println(z);
System.out.println(a);
}
}
}
最终的测试结果是这样的:
这个是看到面试题的公众号,感兴趣的朋友可以关注一下!