【问题标题】:A test for even/odd Java偶数/奇数 Java 测试
【发布时间】:2016-06-19 16:28:57
【问题描述】:

这个测试有用吗?:

if (testInt/2).ofType(Integer){
    //to-do if even
}

我认为如果编译器在 ofType() 之前解析 testInt/2是这样吗??

【问题讨论】:

  • 其中 testInt 是整数类型。
  • 您为什么不简单地使用if(testInt % 2 == 0) 来检查偶数呢?在else 上,您会处理各种可能性。
  • 这甚至无法编译...
  • 不,它不会工作。它将显示编译时错误,因为在 java 中检查类型的语法不正确。
  • 在我看来你的 if 语句结构很糟糕

标签: java testing types integer


【解决方案1】:

最好的方法是始终使用模数运算符。

if (testInt % 2 == 0)
{
//Do stuff
}

//3 % 2 = 1  , therefore odd
//4 % 2 = 0  , therefore even

模数只是从除法中得到余数。

【讨论】:

    【解决方案2】:

    使用模数运算符有效,但有更好的检查方法。所有偶数的最低有效位为 0,奇数为 1。与 1 执行按位与运算,将清除除 LSB 之外的所有内容。检查该位以确定整数的奇偶校验。与计算余数相比,用于清除位的内存更少。

    if ((testInt & 1) == 0) //Even Number
    if ((testInt & 1) == 1) //Odd Number
    /*
      4 & 1 = 0
      5 & 1 = 1
      1342424 & 1 = 0
      5987833 & 1 = 1
    */
    

    【讨论】:

      【解决方案3】:

      这个测试有用吗?

      没有。该表达式执行整数除法(因为两个操作数都是整数),并且表达式的结果始终具有int 类型。比如

         1 / 2 =>  0   // not 0.5
         2 / 2 =>  1   
        -3 / 2 => -2   // not -1.5  or -1 ... 
                       // integer division rounds towards minus infinity
      

      我认为如果编译器在 ofType(); 之前解析 testInt/2是这样吗??

      编译器在编译时解析testInt/2 的静态类型,而instanceof 测试在运行时执行。

      但是,您的假设是不正确的,因为它是基于对表达式和输入的不正确理解。

      • 表达式的编译时类型不依赖于操作数的。它仅取决于操作数的编译时类型。

      • 对于原始类型,没有多态性,所以运行时类型和编译时类型是一样的。


      正如@Cameron C 所说,进行测试的正确方法是使用模运算符%

      @styro 的方法有效,但是:

      • 它的可读性较低 (IMO)
      • 可能更慢
      • 如果它更快,可能没关系。

      【讨论】:

        【解决方案4】:

        试试这个代码...

        public static boolean isEven (int testInt) {
            int i=0;
            while (i <= testInt) {
                if (i==testInt) return true;
                i+=2;
            }
            return false;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-06
          相关资源
          最近更新 更多