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

探讨了Java中取余运算符的行为及其对奇数判断方法的影响,特别是在处理负数时的问题。介绍了如何修复该问题并提供了一种更高效的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
总之,无论何时使用取余操作符,都要考虑操作数和结果的符号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值