java解惑------奇数性(解惑)

java语言中所有的int数值,有一半是负数,而isOdd方法对所有的负奇数的判断都会失效。在任何负整数上调用该方法都会返回false,无论改整数是偶数还是奇数。

这是java取余操作符的定义所产生的后果。该操作符被定义为对所有的int数值a和所有非零int数值b,都满足下面的恒等式:

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

换句话说,如果用b整除,将商乘以b,然后加上余数,那么就得到了最初的值a,改恒等式具有正确的意义,但是当与java的截尾整数整除操作符相结合时,它就意味着:当取余操作返回一个非零结果时,它与左操作时具有相同的正负符号

isOdd方法以及它所基于的对术语“奇数”的定义都假设所有的余数都是正数,虽然改假设对某些种类的整除是有意义的,但是java的取余操作符是与舍弃整除结果小数部分的整除操作是完全匹配的。

当i是一个负奇数时,i%2等于-1,而不是1,因此isOdd方法将错误的返回false。为了防止这种意外,请测试你的方法在为每一个数值型参数传递负数、零和正整数值时,其行为是否正确。

 

这个问题很容易修正。只需将i%2与零比较而不是与1比较,并且使用相反的比较含义即可:

 

public static boolean isOdd(String[] args){
  return i %2 !=0;
}

 

如果正在一个强调性能的环境中使用isOdd方法,那么用位操作符AND替代取余操作符会更好:

public static boolean isOdd(String[] args){
  return (i & 1) !=0;
}
总之,无论何时使用取余操作符,都要考虑操作数和结果的符号。

你可能感兴趣的:(java)