如何在不使用条件的情况下创建返回1或0的方法?

Raf*_*fay 18 c# java logic logical-operators

我在面试中被问了一个问题,如果提供0则返回1并且如果提供1而不使用条件则返回0,即if,ternary等

只是为了给你和想法下面的代码没有if:

public int testMethod(int value){
    if(value==0) return 1;
    if(value==1) return 0;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Java Fiddle

更新: 虽然@ Usagi的答案似乎最适合我写的代码..但重新考虑我重新分析答案的问题.. @ Sergio的答案似乎是最简单和最合适的..

Ser*_*iel 34

如果只给出0和1,那么这可能更简单:

return 1 - value;

  • 哇,很好的解决方案. (2认同)

Usa*_*oto 26

public int testMethod(int value) {
  return 1 - (value % 2); // or 1 - (value & 1)
}
Run Code Online (Sandbox Code Playgroud)

这可以用来在任何值和0之间切换,EG 3:

public int testMethod3(int value) {
  return 3 - (value % 4);
}
Run Code Online (Sandbox Code Playgroud)

并且只是为了覆盖return 0问题中样本的末尾:

private static final int[] VALUES = { 1, 0 };

public int testMethod(int value) {
    try {
        return VALUES[value];
    } catch (ArrayIndexOutOfBoundsException ex) {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于负值,`value = -1`. (2认同)

小智 23

我们可以在这里使用xor运算符.Xor是"exclusive或",当有两个或零时返回0,如果只有一个则返回1.它在整数的每个位上执行此操作.

因此,例如,二进制1001 ^ 1000 = 0001作为第一位有两个1,所以0,接下来的两个没有1,所以为零,最后一位只有一个1,输出1.

public int testMethod(int value){
    return value ^ 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是更好的答案,因为在操作布尔值时,XOR在逻辑上等同于不等式运算符. (3认同)
  • 对于0和1以外的输入,这不会给出与原始代码相同的答案. (2认同)

Mar*_*sch 13

我原来的答案

public int TestMethod(int value)
{
     return Convert.ToInt32(!Convert.ToBoolean(value));
}
Run Code Online (Sandbox Code Playgroud)

以及@The Photon建议的修改过的

public int TestMethod(int value)
{
     return Convert.ToInt32(value == 0);
}
Run Code Online (Sandbox Code Playgroud)

一种不同的方法是基于整数除法的行为C#并避免使用异常处理.

public int TestMethod(int value)
{
    return 1 / ((10 * value) + 1);
}
Run Code Online (Sandbox Code Playgroud)

这三种方法都会返回相同的结果:

In | Out
-2 | 0 
-1 | 0
 0 | 1
 1 | 0
 2 | 0 
Run Code Online (Sandbox Code Playgroud)

  • 唯一的答案是不要忽略最后一个`return 0;` (3认同)

Mal*_*ush 6

您可以像这样使用按位运算符:

value ^ 1
Run Code Online (Sandbox Code Playgroud)

^是按位XOR运算符,"如果在一个操作数中设置但不在两个操作数中,则复制该位".以位为单位表示1和0如下:

1 = 0000 0001

0 = 0000 0000

所以当value = 1时你最终会这样做:

1 ^ 1 =(0000 0001)^(0000 0001)= 0000 0000 = 0因为它们共享相同的比特,所以没有比特被复制.

现在,如果value = 0,你最终会这样做:

0 ^ 1 =(0000 0000)^(0000 0001)= 0000 0001 = 1,因为其中一个操作数中的最后一位为1,而另一个操作数中为0.

  • 考虑0或1以外的输入. (2认同)
  • @ThePhoton: That wasn't the spec given by the op. (2认同)