1

我实际上尝试将四个不同的布尔值转换为真/假。

我的情况是,

   True false false false Then true else false
   false True false false Then true else false
   false false True false Then true else false
   false false false True Then true else false

我试过这样

int a=1;
int b=0;
int c=0;
int d=0;

int cnt=0;

// A block of code will be executed only when any one of the four variables is 1 and
//the rest of them is 0. and another block will be executed when the above mentioned
//condition become false.

if (a==0) { cnt+=1; }
if (b==0) { cnt+=1; }
if (c==0) { cnt+=1; }
if (d==0) { cnt+=1; }

if (cnt==3) { // true block } else { //false block } 

上面的代码工作得很好,但我接受了一个挑战,在一个 if 语句中检查这个条件。然后我像这样尝试。

if(!((!(a==0) && !(b==0)) &&  (!(c==0) && !(d==0))))
{
   //true block
}
else
{
   //false block
}

上述条件在某些组合中失败(a=1 b=0 c=1 d=1)。任何人都可以指出问题是什么。?或提出任何新的想法。?

My objective is convert (3 false + 1 true) into true other wise into false.

[注意:我只是为了理解目的而给出的场景。a、b、c、d 值可能不同。看我的目标。不要说支持 1 和 0 的答案]

4

4 回答 4

5

我想我会使用以下方法,这使得算法可重用并支持任意数量的参数。只有当一个参数为真时,它才返回真。

private boolean oneTrue(boolean... args){
    boolean found = false;

    for (boolean arg : args) {
        if(found && arg){
            return false;
        }
        found |= arg;
    }
    return found;
}

你可以像这样测试它:

private void test(){

    boolean a = false;
    boolean b = true;
    boolean c = false;
    boolean d = false;

    System.out.println(oneTrue(a,b,c,d));
}
于 2013-08-28T07:09:25.107 回答
4

我可以建议的最短的纯布尔解决方案:

System.out.println((a | b) ^ (c | d)) & ((a ^ b) | (c ^ d));

但是在您的程序中已经使用了 1 和 0,如果它始终为 1 和 0 变量,则您可能不使用布尔值,只需使用以下内容:

if (a + b + c + d == 1)
{
  // true
} else
{
  // false
}

如果这个变量可能有任何值。在这种情况下,我建议将其转换为 1 和 0 而不是布尔值,并且再次可以简单地计算总和。

于 2013-08-28T07:22:42.053 回答
2

这个怎么样?

    boolean a = true;
    boolean b = false;
    boolean c = false;
    boolean d = false;

    if ((a ? 1 : 0) + (b ? 1 : 0) + (c ? 1 : 0) + (d ? 1 : 0) == 1) {
        System.out.println("You win!");
    }

[编辑] ...或者这是另一种方法:

    if ((a ^ b ^ c ^ d) & ((a & b) == (c & d))) {
        System.out.println("**XOR** You win!");
    }
于 2013-08-28T07:04:56.060 回答
0

您可以使用以下表达式:

a && !(b || c || d) ||
b && !(a || c || d) ||
c && !(a || b || d) ||
d && !(a || b || c)
于 2013-08-28T07:45:46.260 回答