我上周被问到一个面试问题:
我需要一个函数来打印数字是正数还是负数而不使用条件语句等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.
只是详细说明一下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将每个负数转换成相互转换-1为0.计算-i>>31允许从非正数中得出正数.现在看一下计算出的index:
positive: 1 + 0 - (-1) = 2
zero: 1 + 0 - 0 = 1
negative: 1 + (-1) - 0 = 0
Run Code Online (Sandbox Code Playgroud)
这是一个变体,考虑到零既不是正面的也不是负面的:
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)
| 归档时间: |
|
| 查看次数: |
6829 次 |
| 最近记录: |