public static DevInt[] operator /(DevInt dividen, DevInt divisor) { // Quotient provided as two-part array containing quotient and remainder respectivly. DevInt quotient = new DevInt(); DevInt remainder = new DevInt(dividen); Console.WriteLine( ((dividen.Length - divisor.Length) * 8) + "+" + (dividen.MSB - divisor.MSB) + "\nDivisor " + divisor + "\nDividen " + dividen ); Console.WriteLine("Compare "+compare(divisor,dividen)); if (divisor == 0) { throw new ArgumentException("Divide by Zero exception"); } if (divisor > dividen) { Console.WriteLine("Divisor > dividen"); return new DevInt [] { quotient, dividen }; // although implied below, its best to test now that to have to go through these steps again. } if ((divisor.Length == 1) && ((divisor[0] ^ 0xFE) == 0xFF)) { // divide by 1 optimization. return new DevInt[] { dividen, new DevInt() }; } if ( ((divisor[0] | 0xFE) == 0xFF) && ((dividen[0] | 0xFE) == 0xFF) ) { // it will be a round number and no remainder, should potentialy be solved with a shifting algorithm } int x = (8*divisor.length) - (8 - divisor.MSB); DevInt tmpdivisor = divisor << ((dividen.Length - divisor.Length) * 8) + (dividen.MSB - divisor.MSB); // ((dividen.MSB + 8 * dividen.Length) - (divisor.MSB + 8 * (divisor.Length - 1))); // shift one more than what is needed. int i = 0; Console.WriteLine("BEFORE! remainder:" + remainder + "\ntmpdivisor" + tmpdivisor + "\nquotient" + quotient + "\n----"); do { i++; Console.WriteLine("\tDURING loop "+i+" remainder:" + remainder + "\ntmpdivisor" + tmpdivisor + "\nquotient" + quotient + "\n----"); if (remainder >= tmpdivisor) { Console.WriteLine("\tremainder = remainder - tmpdivisor;\nremainder:" + remainder + "\ntmpdivisor" + tmpdivisor); remainder = remainder - tmpdivisor; quotient = quotient << 1; // Shift must happen before the value is writen, otherwise it will overwrite the value of the previous operation quotient[0] = (byte)(quotient[0] | 0x01); } else { Console.WriteLine("\tremainder < tmpdivisor; shift more"); quotient = quotient << 1; //quotient[0] = (byte)(quotient[0] | 0x00); } tmpdivisor = tmpdivisor >> 1; } while ((i != x) && (remainder > tmpdivisor)); if (remainder == divisor) { // it can be done once more Console.WriteLine("---------------\nAFTER!\n remainder == divisor!!\n remainder:" + remainder + "\ntmpdivisor" + tmpdivisor + "\nquotient" + quotient + "\nx= "+x+" i= "+i+"\n--:::--"); Console.WriteLine("tmpdivisor.MSB = " + tmpdivisor.MSB); return new DevInt[] { (quotient + 1), new DevInt() }; } Console.WriteLine("---------------\nAFTER! remainder:" + remainder + "\ntmpdivisor" + tmpdivisor + "\nquotient" + quotient + "\n----"); Console.WriteLine("tmpdivisor.MSB = " + tmpdivisor.MSB); return new DevInt[] { quotient, remainder }; }