下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗?
public static boolean isOdd(int i){
return i % 2 == 1;
}
奇数可以被定义为被2整除余数为1的整数。表达式 i % 2 计算的是 i 整除 2 时所产生的余数,因此看起来这个程序应该能够正确运转。遗憾的是,它不能;它在四分之一的时间里返回的都是错误的答案。
为什么是四分之一?因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。
这是 Java 对取余操作符(%)的定义所产生的后果。该操作符被定义为对于所有的 int 数值 a 和所有的非零 int 数值 b,都满足下面的恒等式:
(a / b) * b + (a % b) == a
换句话说,如果你用b整除a,将商乘以b,然后加上余数,那么你就得到了最初的值 a 。该恒等式具有正确的含义,但是当与 Java 的截尾整数整除操作符相结合时,它就意味着:当取余操作返回一个非零的结果时,它与左操作数具有相同的正负符号。
当 i 是一个负奇数时,i % 2 等于-1而不是1, 因此 isOdd 方法将错误地返回 false。为了防止这种意外,请测试你的方法在为每一个数值型参数传递负数、零和正数数值时,其行为是否正确。
这个问题很容易订正。只需将 i % 2 与0而不是与1比较,并且反转比较的含义即可:
public static boolean isOdd(int i){
return i % 2 != 0;
}
如果你正在在一个性能临界(performance-critical)环境中使用isOdd方法,那么用位操作符AND(&)来替代取余操作符会显得更好:
public static boolean isOdd(int i){
return (i & 1) != 0;
}
总之,无论你何时使用到了取余操作符,都要考虑到操作数和结果的符号。该操作符的行为在其操作数非负时是一目了然的,但是当一个或两个操作数都是负数时,它的行为就不那么显而易见了。
分享到:
相关推荐
简单java程序键盘录入数判断偶数和奇数.提示用户输入5个100-200(包含100和200)之间的数字判断是不是偶数如果是就将其存放在一个集合当中
读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据;程序输出读到的数据中的奇数和偶数的个数。
主要介绍了Java用三元运算符判断奇数和偶数的简单实现,需要的朋友可以参考下
Java Puzzlers 中文版(Java解惑) ...因为在所有的 int 数值中,有一半都是负数,而 isOdd 方 法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。
(1) 判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 (2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (3) 将int型变量a的第k位清0,即a=a&~(1 ) (4) 将int型变量a的第k位置1, 即a=a ...
如果 n 是奇数,把它乘 3 加1。 用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是: 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 人们猜想(没有得到证明)对于...
编写一个Java程序,从键盘读取一个整数并判断它是奇数还是偶数。 编写一个Java程序,计算并输出斐波那契数列的前 n 个数字,其中 n 是用户从键盘输入的整数。 编写一个Java程序,计算并输出给定整数的阶乘。 编写一...
本书内容包括java语言概述、 eclipse开发工具、 java语言基础、 流程控制、 ...实例016 用三元运算符判断奇数和偶数 . 实例017 不用乘法运算符实现2×16 实例018 实现两个变量的互换(不借助第3个变量)
第一等为边角分配权值300,第二等为奇数边和奇数角分配权值200,剩余部分为第三等,分配权值100.然后在下棋的过程中如果某一行或者某一列满了,则该行或列旁边的行或列权值增加100. 2.电脑等级 电脑水平分为三个...
实例016 用三元运算符判断奇数和偶数 21 实例017 不用乘法运算符实现2×16 22 实例018 实现两个变量的互换 (不借助第3个变量) 23 第4章 流程控制 25 实例019 判断某一年是否为闰年 26 实例020 验证登录信息的合法...
2.3.2、 求 100 以内的整数 的奇数和。 4 2.3.3、。。。。。。。。。。。。。。。。。。。。。。偶数和。 5 2.4 实例演示: 6 2.4.1//判断奇偶数算法。 6 2.4.2&的用法 7 2.4.3瑞年的判断: 7 2.4.4// 6592 //6//5//...
Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典 1.赋值运算函数.2.单例设计模式.3.二维数组中查找目标值、4.替换字符串中的空格。5.从尾到头打印链表.6.由前序和中序遍历重建二叉树.7.用两个栈...
//例:判断一个整数是奇数还是偶数,并将价格打印输出, //定义一个变量存放数据 //int n=11; //从键盘接受数据 //输入一个整数 //求a和b的最大值 //闰年的判断规则:能被4整除而不能被100整除的年
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和...
3、在Java语言里,do-while语句是先执行循环体,然后再判断的循环条件。 ( ) 4、只有抽象类或接口中才能包含抽象方法。 ( ) 其他 8、StringBuffer类的对象包含的字符串不可以被修改。 ( ) 8.字符串 ”\’a\...
java,产生一个8乘8的0、1矩阵,并判断每行、每列及主副对角线是否全为1或全为0
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置...
判断一个数字是奇数还是偶数 用Hibernate 实现分页 35 选7 彩票程序 获取GMT8 时间 中文乱码转换 Big5 字与Unicode 的互换 取得服务器当前的各种具体时间 用半角的特殊符号代替全角的特殊符号 数组和数组之间的转换...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...
因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。 这是 Java 对取余操作符(%)的定义所产生的后果...