Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Gray Code (Algorithmen)

Ein GrayFrank Gray (amerik. Physiker 20. Jh.)-Code ist eine binäre Kodierung der Zahlen (0, 1, 2, 3, …) derart, dass sich von
Zahl zu Zahl nur gerade ein Bit ändert. Der klassische Gray-Code sieht wie folgt aus:

Zahl    Dualsystem    Gray Code
   0      …00000     …00000
   1      …00001     …00001
   2      …00010     …00011
   3      …00011     …00010
   4      …00100     …00110
   5      …00101     …00111
   6      …00110     …00101
   7      …00111     …00100
   8      …01000     …01100
   9      …01001     …01101
   …         …        …

Um von der Darstellung im Dualsystem auf obige Darstellung als Gray-Code zu gelangen, kann einfach wie folgt vorgegangen werden: Betrachten Sie die duale Darstellung von links nach rechts Ziffer für Ziffer. Jedes Mal, wenn sich die Ziffer ändert (1 nach 0 oder 0 nach 1), schreiben Sie eine "1". Wenn sich die Ziffer nicht ändert (0 nach 0 oder 1 nach 1), so schreiben Sie eine "0". Beispiel:

Zahl: 6
Dual:    … 0 0 0 1 1 0
Gray:    …0 0 0 1 0 1

Schreiben Sie ein Programm, das eine ganze Zahl in obigen Gray-Code verwandelt. Geben Sie das Resultat binär aus. Beispiel: "6" wird zu "… 000101".

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

6 Lösung(en)

import java.util.Scanner;

/**
 * Liefere den Standard GrayCode einer Zahl.
 * @author Philipp Gressly (phi AT gressly DOT ch)
 */
public class GrayCode {
  public static void main(String[] args) {
    new GrayCode().top();
  }
  
  void top() {
    int nummer = einlesen("Nummer");
    String code = grayCode(nummer);
    System.out.println("Gray Code = " + code);
  }
  
  /**
   * Erzeuge den Standard Gray Code zu einer positiven ganzen Zahl.
   * @param nummer
   */
  String grayCode(int nummer) {
    if(0 == nummer) return "0";
    String resultat = "";
    while(nummer > 0) {
      if(letzteBeidenZiffernGleich(nummer)) {
        resultat = "0" + resultat; 
      } else {
        resultat = "1" + resultat;
      }
      nummer = nummer / 2;
    }
    return resultat;
  }

  boolean letzteBeidenZiffernGleich(int nummer) {
    int letzteBeidenBits = nummer % 4;
    return 0 == letzteBeidenBits || 3 == letzteBeidenBits; 
  }
  
  Scanner sc = new Scanner(System.in);
  int einlesen(String frage) {
    System.out.println("Bitte geben Sie " + frage + " ein: ");
    return sc.nextInt();
  }
  
} // end of class GrayCode
                
# Gray Code mit Anzahl Stellen
def gray(z,stellen):
    s = bin(z)
    # 0b abschneiden
    s1 = s[2:len(s)]
    laenge = len(s1)
    # Anfang mit Nullen aufuellen
    s2 = '0'*(stellen-laenge)
    s3 = s2+s1
    g=''
    m ='0'
    for i in range(stellen):
        if s3[i] == m:
            g=g+'0'
        else:
            g=g+'1'
        m=s3[i]
    return g

for n in range(32):
    print gray(n,8)

                
'''Dieser Algorithmus produziert den Gray-Code fuer eine gegebene Dezimalzahl.
 
Grundsaetzlich wird die Dezimalzahl zweimal zu einer Liste aus seiner Binaer-Repraesentation konvertiert. Dabei wird die zweite Liste nach rechts geschiftet, d.h. vorne wird eine 0 angehaengt und das hinterste Element wird weggeschnitten.
 
Nun haben wir zwei Listen und vergleichen mit der funktionalen-Funktion 'map' jeweils zwei Elemente miteinander. Sind die Elemente gleich, gibt das eine '0' in der Liste 'gray', ansonsten eine '1'.
 
Am Schluss werden mit 'join' die Elemente aus der Liste 'gray' zu einem String zusammengefuegt. Per 'zfill' werden die gewuenschten Nullen als Praefix gestellt.
'''
 
def gray(decimal, digits):
  # brewed by rethab (www.rethab.ch)
  gray = map(lambda x, y: '0' if x == y else '1', bin(decimal)[2:], '0' + bin(decimal)[2:-1])
  return ''.join(x for x in gray).zfill(digits)
 
print gray(19, 8)
                

Lösung von: Reto Hablützel (www.rethab.ch)

'''
Die Ursprungszahl wird einmal um eine Position nach rechts geshiftet. Damit ist es moeglich mit einem XOR jedes Element mit seinem Vorgaenger zu vergleichen.
Die zweite Zeile ist nur noch Darstellung: Binaerrepraesentation erstellen, '0b' abschneiden, mit Nullen auffuellen.
'''
def gray(decimal, digits):
  #brewed by rethab (www.rethab.ch)
 
  gray = decimal ^ (decimal >> 1)
  return bin(gray)[2:].zfill(digits)
print gray(19, 8)
                

Lösung von: Reto Hablützel (www.rethab.ch)

function decToGray(num) {
  return (num ^ num >> 1).toString(2);
}

console.log(decToGray(19));                                 // lissalanda@gmx.at
                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// C++ 14 | VS-2022
#include <iostream>
#include <bitset>

enum class CodeType {
	encode, decode
};

const auto get_binary(const size_t& val, const size_t& digits) {
	return std::bitset<32>(val).to_string().substr(32 - digits, digits);
}

const auto get_gray(const size_t& num_, const CodeType& codetype_) {
	auto n{ num_ };
	if (codetype_ == CodeType::encode)
		return n ^ (n >> 1);
	else {
		for (size_t i{ 1ULL << 31 }; i > 1; i >>= 1)
			if (n & i) n ^= i >> 1;
		return n;
	}
}

int main() {
	const auto num{ 19 };
	const auto gray{ get_gray(num, CodeType::encode) };
	const auto bin{ get_gray(gray, CodeType::decode) };
    std::cout << get_binary(bin, 8) << "\n";
    std::cout << get_binary(gray, 8) << "\n";
}
                

Lösung von: Jens Kelm (@JKooP)

Verifikation/Checksumme:

19 = 0001 0011 (binär) = 0001 1010 (Gray)

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: k.A.
Webcode: gtwa-psr3
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen