java1309 奇数商问题,Java解惑阅读笔记之1奇数性

以前一直都是看得多写得少(其实基本就没有写过),在iteye,csdn都开过blog,但是都很少写,感觉贡献太少,从今天起要开始努力了,将自己平常用到的,学到的觉得有意思的写出来跟大家一起分享,共同进步。

之前看过《Java Puzzlers》一书,觉得很有意思,最近再翻一遍,将其中一些很tricky的东西做个笔记,与大家分享。都不是自己的原创,版权属于原作者,这本书不错,大家有兴趣的话可以买一本~http://book.douban.com/subject/1473329/

问题:

public static boolean isOdd(int i) {

return i % 2 == 1;

} 可以正确的判断i的奇偶性么?

正解:

不可以,当i为负数时候,i % 2 == -1,因为Java中对%的定义如下

(a / b) * b + (a % b) == a,

但是Java的整数相除采用了截尾操作。正确代码如下:

public class Main1 {

public static boolean isOdd(int i) {

return i % 2 == 1;

}

public static boolean isOdd_2(int i) {

return i % 2 != 0;

}

public static boolean isOdd_3(int i) {

return (i & 1) != 0;

}

public static void main(String[] args) {

//Java整数除法采用截尾操作,%运算满足:(a / b) * b + (a % b) == a,因此%的结果总是与做操作数(被除数)的符号一致

System.out.printf("%d %d\n", 5 / 2, 5 % 2);

System.out.printf("%d %d\n", -5 / 2, -5 % 2);

System.out.printf("%d %d\n", 5 / (-2), 5 % (-2));

System.out.printf("%d %d\n", 5 / (-2), 5 % (-2));

System.out.println(isOdd(-11));

System.out.println(isOdd_2(-11));

System.out.println(isOdd_3(-11));

int N = 1000000;

long start = System.currentTimeMillis();

for (int i = 0; i < N; i++) {

isOdd_2(i);

}

long end = System.currentTimeMillis();

System.out.printf("isOdd_2 takes: %d\n", end - start);

start = System.currentTimeMillis();

for (int i = 0; i < N; i++) {

isOdd_3(i);

}

end = System.currentTimeMillis();

System.out.printf("isOdd_3 takes: %d \n", end - start);

}

} 通过测试可以发现,&比%快了不少,因此最好的方法是isOdd_3,速度快,而且不影响代码可读性~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值