1 /* 2 * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.math; 27 28 /** 29 * A class used to represent multiprecision integers that makes efficient 30 * use of allocated space by allowing a number to occupy only part of 31 * an array so that the arrays do not have to be reallocated as often. 32 * When performing an operation with many iterations the array used to 33 * hold a number is only increased when necessary and does not have to 34 * be the same size as the number it represents. A mutable number allows 35 * calculations to occur on the same number without having to create 36 * a new number for every step of the calculation as occurs with 37 * BigIntegers. 38 * 39 * Note that SignedMutableBigIntegers only support signed addition and 40 * subtraction. All other operations occur as with MutableBigIntegers. 41 * 42 * @see BigInteger 43 * @author Michael McCloskey 44 * @since 1.3 45 */ 46 47 class SignedMutableBigInteger extends MutableBigInteger { 48 49 /** 50 * The sign of this MutableBigInteger. 51 */ 52 int sign = 1; 53 54 // Constructors 55 56 /** 57 * The default constructor. An empty MutableBigInteger is created with 58 * a one word capacity. 59 */ SignedMutableBigInteger()60 SignedMutableBigInteger() { 61 super(); 62 } 63 64 /** 65 * Construct a new MutableBigInteger with a magnitude specified by 66 * the int val. 67 */ SignedMutableBigInteger(int val)68 SignedMutableBigInteger(int val) { 69 super(val); 70 } 71 72 /** 73 * Construct a new MutableBigInteger with a magnitude equal to the 74 * specified MutableBigInteger. 75 */ SignedMutableBigInteger(MutableBigInteger val)76 SignedMutableBigInteger(MutableBigInteger val) { 77 super(val); 78 } 79 80 // Arithmetic Operations 81 82 /** 83 * Signed addition built upon unsigned add and subtract. 84 */ signedAdd(SignedMutableBigInteger addend)85 void signedAdd(SignedMutableBigInteger addend) { 86 if (sign == addend.sign) 87 add(addend); 88 else 89 sign = sign * subtract(addend); 90 91 } 92 93 /** 94 * Signed addition built upon unsigned add and subtract. 95 */ signedAdd(MutableBigInteger addend)96 void signedAdd(MutableBigInteger addend) { 97 if (sign == 1) 98 add(addend); 99 else 100 sign = sign * subtract(addend); 101 102 } 103 104 /** 105 * Signed subtraction built upon unsigned add and subtract. 106 */ signedSubtract(SignedMutableBigInteger addend)107 void signedSubtract(SignedMutableBigInteger addend) { 108 if (sign == addend.sign) 109 sign = sign * subtract(addend); 110 else 111 add(addend); 112 113 } 114 115 /** 116 * Signed subtraction built upon unsigned add and subtract. 117 */ signedSubtract(MutableBigInteger addend)118 void signedSubtract(MutableBigInteger addend) { 119 if (sign == 1) 120 sign = sign * subtract(addend); 121 else 122 add(addend); 123 if (intLen == 0) 124 sign = 1; 125 } 126 127 /** 128 * Print out the first intLen ints of this MutableBigInteger's value 129 * array starting at offset. 130 */ toString()131 public String toString() { 132 return this.toBigInteger(sign).toString(); 133 } 134 135 } 136