检查没有控制结构的值

时间:2010-11-07 19:56:56

标签: java math

我正在努力解决我在作业上遇到的问题。

如何检查某个值是否在某个范围内,例如1≤值≤31,不使用if,switch或任何其他控制结构,在Java?

8 个答案:

答案 0 :(得分:9)

// Zero if valid, non-zero otherwise
int n = (int) Math.floor((value - 1) / 31.0);

// Convert any non-zero value to -1 (0xFFFFFFFF) without any boolean logic.
n |= n << 1;  n |= n >> 1;    
n |= n << 2;  n |= n >> 2;
n |= n << 4;  n |= n >> 4;
n |= n << 8;  n |= n >> 8;
n |= n << 16; n |= n >> 16;

// Value is either -1 or 0. Switch -1 to +1.
n = -n;

// Use array indexing to simulate a conditional.
String[] results = {"valid", "invalid"};
System.out.println(results[n]);

http://ideone.com/98sA8看到它。

您甚至可以将其扩展为运行不同的代码路径:

Runnable[] options = {
    new Runnable() {
        public void run() {
            System.out.println("valid");
        }
    },

    new Runnable() {
        public void run() {
            System.out.println("invalid");
        }
    }
};

options[n].run();

http://ideone.com/sUKiW看到它。

答案 1 :(得分:7)

(value-1)-((value-1+31)%31)

0表示正确,其他任何表示错误。

答案 2 :(得分:4)

您可以将检查设置为布尔值,然后将该布尔值打印出来:

boolean checkValue = (1 <= value && value <= 31);
System.out.println(value);

答案 3 :(得分:4)

您可以使用java断言进行验证,但如果失败,您将获得AssertionError。请参阅http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html

答案 4 :(得分:3)

嗯,从技术上讲,这不使用控制结构:

boolean isWithinRange = value >= 1 && value <= 31;

但是如果你想使用布尔变量,你需要一个控制结构。

可以通过某种方式使用在不满足某些条件时抛出异常的类(例如,大小为31的缓冲区),然后捕获异常,但在内部这个类也将使用控制结构

所以我的答案是 - 不,你不能 - 你总是需要一个控制结构,即使它隐藏在一些类的实现中。

答案 5 :(得分:2)

一个可能很愚蠢的解决方案:

Arrays.asList("1,2,3,4,5,6,7,8,9,10," +
    "11,12,13,14,15,16,17,18,19,20," + 
    "21,22,23,24,25,26,27,28,29,30,31").split(",").
    contains(Integer.toString(value));

答案 6 :(得分:1)

三元运算符是否算作控制结构?它的行为类似于if语句,但它用作运算符而不是独立语句:

System.out.println((1 <= value && value <= 31) ? "valid" : "invalid");

答案 7 :(得分:1)

您可以做的是使用套接字将值发送到服务器。然后有一个真实的人检查条件,让他/她回复你的答案(真,假)。

您可以使用ObjectInputStream作为布尔对象接收答案,因为布尔对象实现了Serializable,您可以避免使用if。只需将接收到的对象强制转换为布尔变量。