Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 布尔测试用例应通过时失败_Java_Boolean - Fatal编程技术网

Java 布尔测试用例应通过时失败

Java 布尔测试用例应通过时失败,java,boolean,Java,Boolean,我用一些Java实践问题来更新自己,帮助我的一些朋友学习如何编写代码,而且,令人尴尬的是,我在一个看似简单的测试用例中失败了一个测试用例,并且看不出我做错了什么。实践问题是: 给定2个int值,如果一个为负,一个为正,则返回true。除非参数负值为真,否则仅当两者都为负时才返回真 我的代码是: public boolean posNeg(int a, int b, boolean negative) { if(negative == true && (a < 0 &am

我用一些Java实践问题来更新自己,帮助我的一些朋友学习如何编写代码,而且,令人尴尬的是,我在一个看似简单的测试用例中失败了一个测试用例,并且看不出我做错了什么。实践问题是:

给定2个int值,如果一个为负,一个为正,则返回true。除非参数
负值
为真,否则仅当两者都为负时才返回真

我的代码是:

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
    ,则如果两个数字都为负数,则希望返回true,因此这意味着两个数字的最左边位都是1,因此
    numberOfLeadingZeros
    将两个数字都返回0
  • 如果负数为
    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
        ,则如果两个数字都为负数,则希望返回true,因此这意味着两个数字的最左边位都是1,因此
        numberOfLeadingZeros
        将两个数字都返回0
      • 如果负数为
        false
        ,那么如果
        (a1&b1==0)
        ,这意味着其中一个数字为负数,但也可能意味着两者都为负数,因此您必须检查
        a1!=b1


      而不是negative==true您应该只编写negative。您可以通过一次比较来编写所有这些内容(参见我的答案)。在C中,甚至更少;)谢谢大家的回复!这真的很有帮助!您应该只编写负数,而不是负数==true。您可以通过一次比较来编写所有这些内容(参见我的答案)。在C中,甚至更少;)谢谢大家的回复!这真的很有帮助!或者干脆:
      返回负数?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:)