zoukankan      html  css  js  c++  java
  • Java解惑之奇数性————《Java解惑》有感+笔记

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

       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++也是会出现的,这里就不多说了

    总结一下

    取余操作遇到负数时要小心符号
  • 相关阅读:
    路飞学城系列:第2章 数据类型&文件操作-学习笔记【2.1-2.34-列表细讲、元组、字符串细讲、字典、集合、二进制与字符编码、16进制、HASH、为何dict字典查询速度快、用py操作文件、file类的其它必用功能等】
    路飞学城系列:第1章 Python基础语法入门-学习笔记(4)-补充【变量的创建、身份运算、空值None、三元运算】
    路飞学城系列:第2章 数据类型&文件操作-练习(3)【模拟登陆-等待优化ing-读写不能同时进行ing】
    路飞学城系列:第2章 数据类型&文件操作-练习(2)【文件操作:全局替换程序】
    路飞学城系列:第2章 数据类型&文件操作-练习(1)【列表index()方法的操作练习】
    路飞学城系列:第1章 Python基础语法入门-作业(1)【双色球选购-中文-自由发挥】
    Java泛型的理解
    LeetCode 力扣 99. 恢复二叉搜索树
    深入理解Java虚拟机---栈,堆,方法区
    java中API补充总结
  • 原文地址:https://www.cnblogs.com/Jabba93/p/2701641.html
Copyright © 2011-2022 走看看