## 一 负数有没有奇偶性
有
## 二 写一个方法判断是否为奇数
### 关于这个取余号
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的指数的取模操作,优化成位操作~~