博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java解惑之奇数性————《Java解惑》有感+笔记
阅读量:6649 次
发布时间:2019-06-25

本文共 1797 字,大约阅读时间需要 5 分钟。

当我们要判断一个数是否为奇数时我们经常会写以下代码

1:  public static boolean isOdd(int i)
2:  {
3:      return i%2==1;
4:  }

但是当i为负奇数的时候,i%2返回值为-1不是1,所以当i为负数的时候函数的返回值都是false。

原因在于,Java对取余操作符的定义为

对所有int数值a和所有非零int数值b,都满足以下恒等式

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

很明显,a%b取余后的数必须和a一样的符号才能满足以上等式。

所以,在Java中i%2==1 不等于i%2!=0;

因此,在java中你可以这样判断一个数是不是奇数,只要判断他不是偶数就可以了

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

当然这还有更好的办法,你可以用与符号来完成判断是否为一个偶数或者奇数

1:  public static boolean isOdd(int i)
2:  {
3:      return (i&1)==1;
4:  }

原理是奇数用二进制表示最后一位总是1,当和1与操作的时候就剩下最后一位为1了

偶数也是同样道理,我就不多说了,这种算法比上面取余的算法要快一点(毕竟计算

机比较喜欢使用逻辑运算的,不信的话可以自己验证一下,我把我的验证代码也贴出来一下),

1:  public class MainClass
2:  {
3:      public static void main(String[] args)
4:      {
5:          for (int j = 0; j < 100000000; j++){}//不写这个的话,第二个运行的总会比第一个块,其实就是让它稳定后再测试
6:          final int time = 1999999999;
7:  //        Scanner s = new Scanner(System.in);
8:          long startTime = System.nanoTime();
9:          for (int i = 0; i < time; i++)
10:          {
11:              isOdd(i);
12:          }
13:   
14:          long endTime = System.nanoTime();
15:   
16:          System.out.println(endTime - startTime);
17:          long startTime2 = System.nanoTime();
18:   
19:   
20:          for (int i = 0; i < time; i++)
21:          {
22:              isOdd2(i);
23:          }
24:          long endTime2 = System.nanoTime();
25:          System.out.println(endTime2 - startTime2);
26:      }
27:   
28:      public static boolean isOdd(int i)
29:      {
30:          return (i & 1) != 0;
31:      }
32:   
33:      public static boolean isOdd2(int i)
34:      {
35:          return (1 % 2) != 0;
36:      }
37:   
38:  }

并且符合计算机的思维所以我推荐使用最后一种的方法。这个问题同样在C++也是会出现的,这里就不多说了

 

总结一下

取余操作遇到负数时要小心符号

转载于:https://www.cnblogs.com/Jabba93/archive/2012/09/25/2701641.html

你可能感兴趣的文章
Linux Kernel 3.7 RC3/3.6.4/3.4.16/3.0.49
查看>>
ubuntu12.04 双网卡绑定
查看>>
D3D11中的硬件反锯齿 SSAA/MSAA/EQAA/CSAA(1)
查看>>
Android InputStreamReader 解析gbk、gb2312编码的xml文件 编码问题.
查看>>
记录安装oracle的那些事(二)之双系统安装
查看>>
ssh服务器配置方法
查看>>
Django安装配置
查看>>
bootstrap源码学习与示例:bootstrap-tab
查看>>
[C] 让VC支持C99的整数类型V1.01。避免包含目录问题,更名auto_stdint.h、auto_inttypes.h(在VC6至VC2012、GCC、BCB等编译器下测试通过)...
查看>>
Apache OFBiz 10.04.05 发布,安全漏洞修复
查看>>
京东书4
查看>>
Java EE之RMI
查看>>
ASCII编码表 -- SQL注入 也需要
查看>>
MySQL常用数据类型介绍
查看>>
当装系统时遇到“选中的磁盘采用GPT分区形式”
查看>>
CentOS的远程桌面(xdm)
查看>>
Some aspects to prepare
查看>>
oracle 好书 05 ( 内存组件与 oracle 进程 )
查看>>
Linux gdb符号调试器
查看>>
http_load
查看>>