I am working with 32 bit integers which have a maximum value of 2,147,483,647, but am wanting to support higher numbers by having two variables (billions and remainder). I am trying to figure out a way where I can apply multiplication to the number as a whole while working with it split up.
Example 1: billions=1, remainder=500000000, multiplier=2. Expected output: billions=3 and remainder=0.
Example 2: billions=0, remainder=200000000, multiplier=5. Expected output: billions=1 and remainder=0.
Example 3: billions=2, remainder=999999999, multiplier=5. Expected output: billions=14 and remainder=999999995.
I'm having difficulty coming up with a way to properly calculate what each of the values should be at the end when applying the multiplication. I am wanting to avoid loops to cut down on any performance hit with higher multipliers.
It appears you want Arbitrary Precision Integers where the digits of precision are arbitrary.
One way to do that would be to consider the integers in a Modular Residue Number system where you choose a base of primes $p_i$ (or even relatively prime numbers) and store the integer as the remainder modulo $p_i$. You can choose the primes such that the product $\prod_i p_i$ is greater than the largest integer you want to represent.
Example: $M = \{2, 3, 5\}$ will allow you to represent integers $0$ to $29$ (total of 30) since $2\times 3 \times 5 = 30$.
Since there are infinitely many primes, you can have as large a precision as you want.
Arithmetic modulo residues is well defined and addition, subtraction, multiplication are very easy to do. Division requires computing the modular inverse which can be done using the Euclidean Algorithm.
You use the Chinese Remainder Theorem to convert the number from the Modular Residue Number form to decimal form.