Løsningsforslag - oppgaver i Avsnitt 1.3.13


Oppgave 1

  int k = -1;
  int d = 1;
  System.out.println(k >> d);
  System.out.println(k >>> d);

Oppgave 2

  int k = -1;
  int d = -1;
  System.out.println(k >> d);
  System.out.println(k >> (d & 31));

Oppgave 3

  public static void leftshift(int[] a, int d)
  {
    if (d < 0) throw new IllegalArgumentException("Negativ parameter!");

    if (a.length < 1) return;
    d %= a.length;

    for (int i = d; i < a.length; i++) a[i - d] = a[i];
    for (int i = a.length - d; i < a.length; i++) a[i] = 0;
  }

Eksempel på bruk av leftshift:

  int[] a = {0,0,0,0,1,1,1,1};

  for (int verdi : a) System.out.print(verdi);   // utskrift av a
  leftshift(a,2);                              // shift venstre

  System.out.println();                          // linjeskift
  for (int verdi : a) System.out.print(verdi);   // utskrift av a

  // 00001111
  // 00111100

Oppgave 4

  public static void rotasjon(char[] a, int d)
  {
    int n = a.length;  if (n < 2) return;                 // tomt eller en verdi
    if ((d %= n) < 0) d += n;

    if (d <= (n+1)/2)  // forskyver d enheter mot høyre
    {
      char[] b = Arrays.copyOfRange(a, n - d, n);         // hjelpetabell
      for (int i = n - 1; i >= d; i--) a[i] = a[i - d];   // forskyver
      System.arraycopy(b, 0, a, 0, d);                    // kopierer
    }
    else  // forskyver mot venstre n - d enheter mot venstre
    {
      char[] b = Arrays.copyOfRange(a, 0, n - d);         // hjelpetabell
      for (int i = 0; i < d; i++) a[i] = a[i + n - d];    // forskyver
      System.arraycopy(b, 0, a, d, n - d);                // kopierer 
    }
  }

Oppgave 5

Gitt at du allerede har en bytt-metode for heltallstabeller, trengs kun å bytte datatypen på tabellen fra char til int:

  public static void rotasjon(int[] a, int d)
  {
    int n = a.length;
    if (n < 2) return;                                     // tomt eller en verdi

    if ((d %= n) < 0) d += n;                              // motsatt vei?

    for (int v = 0, h = n - 1; v < h; Tabell.bytt(a, v++, h--));  // snur a[a:n>
    for (int v = 0, h = d - 1; v < h; Tabell.bytt(a, v++, h--));  // snur a[0:d>
    for (int v = d, h = n - 1; v < h; Tabell.bytt(a, v++, h--));  // snur a[d:n>
  }

Oppgave 6

  char[] c = "ABCDEFGHIJKLMNOP".toCharArray();

  int d = 3;  // bruk 1, 5, 7, 9, 11, 13 og 15
  char temp = c[0];  // tar vare på verdien i indeks 0

  for (int i = -d, j = 0; i != 0; i -= d)  // stopper i 0
  {
    if (i < 0) i += 16;     // sjekker fortegnet til indeks i
    c[j] = c[i];            // kopierer
    j = i;                  // oppdaterer indeks j
  }

  c[d] = temp;        // legger tilbake verdien
  System.out.println(Arrays.toString(c));

Oppgave 7

 Utgangspunkt: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]
 Med d = 6:    [K, B, M, D, O, F, A, H, C, J, E, L, G, N, I, P]