java - 添加固定的最小/最大值

标签 java integer overflow modulo

主要编辑:100% 解决了!它被称为模块化算术,谢谢彼得!

我需要添加两个具有固定最小值/最大值的数字。 我希望我的数字表现得像 java 的 int/byte/short(溢出到相反的值并继续操作)

System.out.println((byte) (Byte.MAX_VALUE));    // 127
System.out.println((byte)(Byte.MAX_VALUE + 1)); // -128
System.out.println((byte)(Byte.MAX_VALUE + 2)); // -127
System.out.println((byte)(Byte.MAX_VALUE + 3)); // -126

但具有固定的 .MAX_VALUE 和 .MIN_VALUE。如果一个数字的值是 3,它的最大值是 5,最小值是 2,那么当我给它加 4 时(3+4=应该是 7)它会溢出 所以 3+4:3 -> 4 -> 5 -> 2 -> 3 示例:

    int value = 0, minValue = -2, maxValue = 1;
    MyNumber n = new MyNumber(value, minValue, maxValue);

    // possible values: -2 -1  0  1 -2 -1  0  1 -2 -1  0  1 ..

    n.add(2);   // 0+2 = -2
    n.add(-2);  // -2-2 = 0
    n.add(5);   // 0+5 = 1       
    n.add(-5);  // 1-5 = 0       
    n.add(-5);  // 0-5 = -1       
    n.add(-1);  // -1-1 = -2       
    n.add(11);  // -2+11 = 1

这是我做的:

class MyNumber {

    int value;
    final int minValue, maxValue;

    public MyNumber(int value, int minValue, int maxValue) {
        if (value < minValue || value > maxValue || maxValue < minValue) {
            throw new RuntimeException();
        }
        this.value = value;
        this.minValue = minValue;
        this.maxValue = maxValue;
    }

    void add(int amount) {
        int step = 1;
        if (amount < 0) {
            step = -1;
            amount = -amount;
        }
        while (amount-- > 0) {
            value += step;
            if (value < minValue)
                value = maxValue; // overflows
            if (value > maxValue)
                value = minValue; // overflows
        }
    }
}

它有效,但我不想迭代整个加法,因为我要处理大数字 我认为这与 MOD 有关...(我的数学很糟糕) 我几乎是随机地做了这个:

void add(int amount) {
    value = (value + amount) % (maxValue - minValue + 1);
}

我很接近但是失败了

n = new MyNumber(-2, -4, -1);
n.add(2); // -2+2 shows 0 instead of -4   (-2.. -1.. *overflow*.. -4)

我投降

最佳答案

我会尽量把事情说清楚。例如

如果你想要时钟运算你可以做

   // in the constructor
   this.range = maxValue - minValue + 1;
   this.value = -minValue;

   // in the adder.
   public void add(int num) {
       value = (value + num) % range;
       if(value < 0) value += range;
       // or
       value = ((value + num) % range + range) % range;
   }


   // add a getter for value.
   public int getValue() { return value + minValue; };

如果你想要有界算术。

    value = Math.min(maxValue, Math.max(minValue, value + step));

关于java - 添加固定的最小/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12209211/

相关文章:

c++ - 不能使用 push_back 将整数插入 1D/2D vector

html - 防止表扩展到父级之外

javascript - 我如何确定何时溢出 :hidden parent is overflown 的 child

Linux 上的 java.lang.UnsatisfiedLinkError 错误

r - 为什么R将大数视为偶数

Java ~ 通过套接字连接发送枚举

java - 将 ArrayList<String> 转换为 int[]

css - 打印不符合显式高度/溢出的 CSS : none?

java - 从 onPause() 启动时 MediaPlayer 循环

java - 为不同选项卡下的按钮设置相同的快捷键