Oppgave 1
Oppgave 2
| Divisor d | n / d kan erstattes med | Intervall for n |
| 11 | n * 47663 >>> 19 | 0 <= n < 90112 |
| 12 | (n >> 2) * 43691 >>> 17 | 0 <= n < 393216 |
| 13 | n * 20165 >>> 18 | 0 <= n < 212992 |
| 14 | (n >> 1) * 74899 >>> 19 | 0 <= n < 114688 |
Oppgave 3
Her vil tidsforbruket være avhengig av prosessor, operativsystem og Java-kompilator. Bruk av en Pentium 4 - 2,8GHz, Windows XP og Java v. 1.5.0_06 gav et tidsforbruk på ca. 1 sekund for N = 360000000.
Oppgave 4
public static int div5(int n)
{
int q = (n >> 3) + (n >> 4);
q += (q >> 4);
q += (q >> 8);
int r = n - q*5;
return q + (r*52429 >>> 18);
}
Oppgave 5
Flg. kode er hentet fra en fil under avsnittet "More on Division by Constants" på www.hackersdelight.org:
public static int div3(int n)
{
int q = (n >> 2) + (n >> 4);
q += (q >> 4);
q += (q >> 8);
q += (q >> 16);
int r = n - q*3;
return q + (11*r >> 5);
}
public static int div7(int n)
{
int q = (n >> 1) + (n >> 4);
q += (q >> 6);
q += (q >> 12) + (q >> 24);
q >>= 2;
int r = n - q*7;
return q + ((r + 1) >> 3);
}
Oppgave 6
public static String toString(int n)
{
if (n == -2147483648) return "-2147483648";
boolean negativ = false;
if (n < 0)
{
n = -n;
negativ = true;
}
char[] c = new char[11]; // maks 10 siffer + fortegn
int i = 11, m = 0;
if (n >= 100000)
{
m = n / 100000;
n = n - m * 100000;
}
for (;;)
{
int q = (n >> 1) * 52429 >>> 18;
c[--i] = (char)(n - q*10 + 48);
n = q;
if (n == 0)
{
if (m > 0) {n = m; m = 0;}
else break;
}
}
if (negativ) c[--i] = '-';
return new String(c,i,11-i);
}