Java 布尔测试用例应通过时失败
我用一些Java实践问题来更新自己,帮助我的一些朋友学习如何编写代码,而且,令人尴尬的是,我在一个看似简单的测试用例中失败了一个测试用例,并且看不出我做错了什么。实践问题是: 给定2个int值,如果一个为负,一个为正,则返回true。除非参数Java 布尔测试用例应通过时失败,java,boolean,Java,Boolean,我用一些Java实践问题来更新自己,帮助我的一些朋友学习如何编写代码,而且,令人尴尬的是,我在一个看似简单的测试用例中失败了一个测试用例,并且看不出我做错了什么。实践问题是: 给定2个int值,如果一个为负,一个为正,则返回true。除非参数负值为真,否则仅当两者都为负时才返回真 我的代码是: public boolean posNeg(int a, int b, boolean negative) { if(negative == true && (a < 0 &am
负值
为真,否则仅当两者都为负时才返回真
我的代码是:
public boolean posNeg(int a, int b, boolean negative) {
if(negative == true && (a < 0 && b < 0))
return true;
else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
return true;
return false;
}
public boolean posNeg(int a,int b,boolean negative){
如果(负==true&&(a<0&&b<0))
返回true;
如果(负==假&&(a<0&&b>0)| |(a>0&&b<0))
返回true;
返回false;
}
测试用例是:posNeg(1,-1,true)
->false(我的输出是true,这是不正确的)。这就是罪魁祸首:
else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
这就是罪魁祸首:
else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
这是一个很好的一行,使用三元条件运算符:
public static boolean posNeg(int a, int b, boolean negative)
{
return negative ? a < 0 && b < 0 : ((a < 0) ^ (b < 0));
}
public静态布尔posNeg(int a,int b,布尔负)
{
返回负值?a<0&&b<0:((a<0)^(b<0));
}
这是一个很好的一行,使用三元条件运算符:
public static boolean posNeg(int a, int b, boolean negative)
{
return negative ? a < 0 && b < 0 : ((a < 0) ^ (b < 0));
}
public静态布尔posNeg(int a,int b,布尔负)
{
返回负值?a<0&&b<0:((a<0)^(b<0));
}
您的输出正常,应该更改
if( negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
就像
( negative == false && (a < 0 && b > 0) ) || (a > 0 && b < 0)
^ ^
(否定==false&&(a<0&&b>0))| |(a>0&&b<0)
^ ^
您的输出正常,应该更改
if( negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
就像
( negative == false && (a < 0 && b > 0) ) || (a > 0 && b < 0)
^ ^
(否定==false&&(a<0&&b>0))| |(a>0&&b<0)
^ ^
试着这样简化它
public boolean posNeg(int a, int b, boolean negative) {
if (negative) return a < 0 && b < 0;
else return 1L * a * b < 0L;
}
public boolean posNeg(int a,int b,boolean negative){
如果(负)返回a<0&&b<0;
否则返回1L*a*b<0L;
}
试着这样简化它
public boolean posNeg(int a, int b, boolean negative) {
if (negative) return a < 0 && b < 0;
else return 1L * a * b < 0L;
}
public boolean posNeg(int a,int b,boolean negative){
如果(负)返回a<0&&b<0;
否则返回1L*a*b<0L;
}
问题似乎在于:
else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
else if(否定==false&&(a<0&&b>0)|(a>0&&b<0))
您正在编写(false和false或true),因此OR案例的计算结果为true,从而输入if语句。
试着这样写:
else if (!negative && ((a < 0 && b > 0 ) || (a > 0 && b < 0)))
else如果(!negative&&((a<0&&b>0)| |(a>0&&b<0)))
也就是说:(false和(false或true)),每次评估否定标志时问题似乎就在这一行:
else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
else if(否定==false&&(a<0&&b>0)|(a>0&&b<0))
您正在编写(false和false或true),因此OR案例的计算结果为true,从而输入if语句。
试着这样写:
else if (!negative && ((a < 0 && b > 0 ) || (a > 0 && b < 0)))
else如果(!negative&&((a<0&&b>0)| |(a>0&&b<0)))
也就是说:(false和(false或true)),每次评估否定标志时,需要一个较短的版本
public boolean posNeg(int a, int b, boolean negative) {
return (negative ? a & b : a ^ b) < 0;
}
这里的一个技巧是,>-1
为int
和long
提供了顶部位0或1
public boolean posNeg(int a, int b, boolean negative) {
return (negative ? a & b : a ^ b) < 0;
}
这里的一个技巧是,
>-1
为int
和long
提供顶部位0或1,您也可以这样做:
public boolean posNeg(int a, int b, boolean negative) {
int a1 = Integer.numberOfLeadingZeros(a);
int b1 = Integer.numberOfLeadingZeros(b);
return negative ? (a1 + b1) == 0 : ((a1 & b1) == 0 && (a1 != b1));
}
说明:
- 如果负数为
,则如果两个数字都为负数,则希望返回true,因此这意味着两个数字的最左边位都是1,因此true
将两个数字都返回0numberOfLeadingZeros
- 如果负数为
,那么如果false
,这意味着其中一个数字为负数,但也可能意味着两者都为负数,因此您必须检查(a1&b1==0)
a1!=b1
- 您也可以这样做:
public boolean posNeg(int a, int b, boolean negative) {
int a1 = Integer.numberOfLeadingZeros(a);
int b1 = Integer.numberOfLeadingZeros(b);
return negative ? (a1 + b1) == 0 : ((a1 & b1) == 0 && (a1 != b1));
}
说明:
- 如果负数为
,则如果两个数字都为负数,则希望返回true,因此这意味着两个数字的最左边位都是1,因此true
将两个数字都返回0numberOfLeadingZeros
- 如果负数为
,那么如果false
,这意味着其中一个数字为负数,但也可能意味着两者都为负数,因此您必须检查(a1&b1==0)
a1!=b1
返回负数?a*b>0:a*b<0代码>这在许多情况下都会溢出:“返回a*b<0”。确保你的答案是“长”。@user2336315考虑到他试图教某人基本的编码,你的例子远远不够高级。或者干脆:return negative?a*b>0:a*b<0代码>这在许多情况下都会溢出:“返回a*b<0”。请确保使用long。@user2336315考虑到他试图教某人基本的编码,您的示例远远不够高级。您比jit更聪明,+1除非此操作的性能非常关键,否则我认为最好编写可读的代码,也就是说,使用普通的比较操作而不是位操作。你比jit更聪明,+1除非这个操作的性能非常关键,否则我认为最好编写可读的代码,也就是说,使用普通的比较操作而不是位操作。@MartijnCourteaux拜托;)不,我不偷密码。我写了我的答案,而没有看到其他答案,我发现了你的错误。如果你愿意的话,会投票给你的答案吗,NP。好吧,给你:+1:)@MartijnCourteaux来吧;)不,我不偷密码。我写了我的答案,而没有看到其他答案,我发现了你的错误。如果你愿意的话,会投票给你的答案吗,NP。好了,给你:+1:)