不使用java中的条件语句检查正面或负面

OMG*_*POP 11 java

我上周被问到一个面试问题:

我需要一个函数来打印数字是正数还是负数而不使用条件语句等if else while for switch a? b:c.我该怎么做.

我告诉采访者,这个问题本质上是"有条件的",这是不可能的.他告诉我这是可能的,但没告诉我怎么做.我做了很多搜索,但没有很好的答案.

use*_*751 20

一种可能的方案:

String[] responses = {"Positive", "Negative"};
System.out.println(responses[(i >> 31) & 1]);
Run Code Online (Sandbox Code Playgroud)

这也是零作为正数.

因为Java中的整数需要以二进制补码存储(或者表现得像它们一样),否则任何负数的最高位为1,而任何其他数字(i >> 31)的最高位为0. 将最高位复制到每隔一位(所以负数变为11111111 11111111 11111111 11111111正数/零数变为00000000 00000000 00000000 00000000).& 1将除最低位之外的所有位设置为0.该组合(i >> 31) & 1有效地仅读取最高位i.


maa*_*nus 6

只是详细说明一下immibis的回答:

int index(int i) {
    return 1 + (i>>31) - (-i>>31);
}

String[] text = {"negative", "zero", "positive"};

private String text(int i) {
    return text[index(i)];
}
Run Code Online (Sandbox Code Playgroud)

签名班次i>>31将每个负数转换成相互转换-10.计算-i>>31允许从非正数中得出正数.现在看一下计算出的index:

positive: 1 +    0 - (-1) = 2
zero:     1 +    0 -    0 = 1
negative: 1 + (-1) -    0 = 0
Run Code Online (Sandbox Code Playgroud)


Wcr*_*sse 5

这是一个变体,考虑到零既不是正面的也不是负面的:

    int x = (int)Math.sqrt(Math.pow(n, 2));
    try {
        x = n / x;
    }
    catch (ArithmeticException e) {
        x = 0;
    }

    String[] result = {"negative", "zero", "positive"};
    System.out.println(result[x + 1]);
Run Code Online (Sandbox Code Playgroud)

  • 这认为整数> 46340或<-46340为零.我不同意. (3认同)
  • 你也可以使用`Math.signum` (2认同)