关于判断一个数是不是奇数&&位运算

2019-05-07

## 一 负数有没有奇偶性

## 二 写一个方法判断是否为奇数

### 关于这个取余号

5-2%2== 5减号优先级小于取余号

(-5)%2==-1余数为负,考虑一下计算过程:

 

n*被除数+X==除数,Java和Python中,余数取的是绝对值最小的那个

 

 

### 初始方法
public static boolean isOdd(int i){ if(i%2==1){ return true; }else{ return false; } }

### 可是。。

if() 布尔表达式--类型就是布尔类型,要求的返回值也是布尔~~~~

so:

public static boolean isOdd(int i){ return i%2!=0; }

### 可是。。如果嫌取模慢呢?位运算~~

int i;

i=1:0000 0000 0000 00000000 0000 0000 0001

i=2:0000 0000 0000 00000000 0000 0000 0010

i=4:0000 0000 0000 00000000 0000 0000 0100

i=-1:~1 +1

    =1111 1111 1111 11111111 1111 1111 1111 

i=-2:1111 1111 1111 1111 1111 1111 1111 1110

所以,正数 奇数最后一位 是 1,偶数 是 0;负数:对应正数取反后,奇数最后一位是0,偶数是 1,但是负数最后一位要加1,所以,负奇数最后一位还是1,负偶数最后一位还是0。

所以 i&1===1(奇数)===0(偶数)

所以:

### 用位运算代替取模

```public static boolean isOdd(int i){ return (i&1)==1; }```

## 但是,真的快了吗?上面的 按位与操作 和 取模操作,实际运算时间差不多呢?

···因为 编译器会将 对2的指数的取模操作,优化成位操作~~