Generar códigos grises de n bits | conjunto 2

Dado un número n, genere patrones de bits de 0 a 2 ^ n-1 de modo que los patrones sucesivos difieran en un bit.

Ejemplos: 

Entrada: n=2
Salida: 00 01 11 10
Explicación:
Cada elemento adyacente del código gris difiere solo en un bit. Así que los códigos grises de n bits son: 00 01 11 10

Entrada: n=3
Salida: 000 001 011 010 110 111 101 100
Explicación:
Cada elemento adyacente del código gris difiere solo en un bit. Así que los códigos grises de n bits son: 000 001 011 010 110 111 101 100

Ya se ha discutido otro enfoque de generar códigos grises de n bits .

Enfoque: 
La idea es obtener el código gris de un número binario usando XOR y la operación de desplazamiento a la derecha. 

  1. El primer bit (MSB) del código gris es el mismo que el primer bit (MSB) de los números binarios.
  2. El segundo bit (desde el lado izquierdo) del código gris es igual a XOR del primer bit (MSB) y el segundo bit (segundo MSB) del número binario.
  3. El tercer bit (desde el lado izquierdo) del código gris es igual a XOR del segundo bit (2nd MSB) y un tercer bit (3rd MSB) y así sucesivamente.

De esta forma, se puede calcular el código gris para el número binario correspondiente. Entonces, se puede observar que el i-ésimo elemento puede estar formado por XOR bit a bit de i y floor(i/2) que es igual al XOR bit a bit de i y (i >> 1), es decir, i desplazado a la derecha por 1. Al realizar esto, el MSB del número binario se mantiene intacto y todos los demás bits se ejecutan XOR bit a bit con su bit superior adyacente.

C++

// C++ program to generate n-bit
// gray codes
#include <bits/stdc++.h>
using namespace std;
 
// Function to convert decimal to binary
void decimalToBinaryNumber(int x, int n)
{
    int* binaryNumber = new int(x);
    int i = 0;
    while (x > 0) {
        binaryNumber[i] = x % 2;
        x = x / 2;
        i++;
    }
 
    // leftmost digits are filled with 0
    for (int j = 0; j < n - i; j++)
        cout << '0';
 
    for (int j = i - 1; j >= 0; j--)
        cout << binaryNumber[j];
}
 
// Function to generate gray code
void generateGrayarr(int n)
{
    int N = 1 << n;
    for (int i = 0; i < N; i++) {
 
        // generate gray code of corresponding
        // binary number of integer i.
        int x = i ^ (i >> 1);
 
        // printing gray code
        decimalToBinaryNumber(x, n);
 
        cout << endl;
    }
}
 
// Drivers code
int main()
{
    int n = 3;
    generateGrayarr(n);
    return 0;
}

Java

// Java program to generate
// n-bit gray codes
import java.io.*;
 
class GFG {
 
    // Function to convert
    // decimal to binary
    static void decimalToBinaryNumber(int x,
                                      int n)
    {
        int[] binaryNumber = new int[x];
        int i = 0;
        while (x > 0) {
            binaryNumber[i] = x % 2;
            x = x / 2;
            i++;
        }
 
        // leftmost digits are
        // filled with 0
        for (int j = 0; j < n - i; j++)
            System.out.print('0');
 
        for (int j = i - 1;
             j >= 0; j--)
            System.out.print(binaryNumber[j]);
    }
 
    // Function to generate
    // gray code
    static void generateGrayarr(int n)
    {
        int N = 1 << n;
        for (int i = 0; i < N; i++) {
 
            // generate gray code of
            // corresponding binary
            // number of integer i.
            int x = i ^ (i >> 1);
 
            // printing gray code
            decimalToBinaryNumber(x, n);
 
            System.out.println();
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 3;
        generateGrayarr(n);
    }
}
 
// This code is contributed
// by anuj_67.

Python3

# Python program to generate
# n-bit gray codes
 
# Function to convert
# decimal to binary
def decimalToBinaryNumber(x, n):
    binaryNumber = [0]*x;
    i = 0;
    while (x > 0):
        binaryNumber[i] = x % 2;
        x = x // 2;
        i += 1;
 
    # leftmost digits are
    # filled with 0
    for j in range(0, n - i):
        print('0', end ="");
 
    for j in range(i - 1, -1, -1):
        print(binaryNumber[j], end ="");
 
# Function to generate
# gray code
def generateGrayarr(n):
    N = 1 << n;
    for i in range(N):
         
        # generate gray code of
        # corresponding binary
        # number of integer i.
        x = i ^ (i >> 1);
 
        # printing gray code
        decimalToBinaryNumber(x, n);
 
        print();
 
# Driver code
if __name__ == '__main__':
    n = 3;
    generateGrayarr(n);
 
# This code is contributed by 29AjayKumar

C#

// C# program to generate
// n-bit gray codes
using System;
 
class GFG {
 
    // Function to convert
    // decimal to binary
    static void decimalToBinaryNumber(int x,
                                      int n)
    {
        int[] binaryNumber = new int[x];
        int i = 0;
        while (x > 0) {
            binaryNumber[i] = x % 2;
            x = x / 2;
            i++;
        }
 
        // leftmost digits are
        // filled with 0
        for (int j = 0; j < n - i; j++)
            Console.Write('0');
 
        for (int j = i - 1;
             j >= 0; j--)
            Console.Write(binaryNumber[j]);
    }
 
    // Function to generate
    // gray code
    static void generateGrayarr(int n)
    {
        int N = 1 << n;
        for (int i = 0; i < N; i++) {
 
            // Generate gray code of
            // corresponding binary
            // number of integer i.
            int x = i ^ (i >> 1);
 
            // printing gray code
            decimalToBinaryNumber(x, n);
 
            Console.WriteLine();
        }
    }
 
    // Driver code
    public static void Main()
    {
        int n = 3;
        generateGrayarr(n);
    }
}
 
// This code is contributed
// by anuj_67.

Javascript

<script>
 
// JavaScript program to generate n-bit
// gray codes
 
// Function to convert decimal to binary
function decimalToBinaryNumber(x, n)
{
    var binaryNumber = Array(x);
    var i = 0;
    while (x > 0) {
        binaryNumber[i] = x % 2;
        x = parseInt(x / 2);
        i++;
    }
 
    // leftmost digits are filled with 0
    for (var j = 0; j < n - i; j++)
        document.write('0');
 
    for (var j = i - 1; j >= 0; j--)
        document.write( binaryNumber[j]);
}
 
// Function to generate gray code
function generateGrayarr(n)
{
    var N = 1 << n;
    for (var i = 0; i < N; i++) {
 
        // generate gray code of corresponding
        // binary number of integer i.
        var x = i ^ (i >> 1);
 
        // printing gray code
        decimalToBinaryNumber(x, n);
 
        document.write("<br>");
    }
}
 
// Drivers code
var n = 3;
generateGrayarr(n);
 
</script>
Producción

000
001
011
010
110
111
101
100

Análisis de Complejidad: 

  • Complejidad temporal: O(2 n ). 
    Solo se necesita un recorrido de 0 a (2 n ).
  • Espacio Auxiliar: O(log x). 
    Se requiere un espacio de (log x) para la representación binaria de (x)
     

Publicación traducida automáticamente

Artículo escrito por Ajitesh Mandal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *