Calcule la paridad de un número usando XOR y búsqueda de tabla

La paridad de un número se refiere a si contiene un número par o impar de 1 bit. El número tiene «paridad impar», si contiene un número impar de 1 bits y es «paridad par» si contiene un número par de 1 bits.

1 --> parity of the set is odd
0 --> parity of the set is even

Ejemplos:

Input : 254
Output : Odd Parity
Explanation : Binary of 254 is 11111110. 
There are 7 ones. Thus, parity is odd.

Input : 1742346774
Output : Even

Método 1: (Enfoque ingenuo) Ya hemos discutido este método aquí . Método 2: (Eficiente) Pre-requisitos: Tabla de búsqueda , magia X-OR Si descomponemos un número S en dos partes S 1 y S 2 tal S = S 1 S 2 . Si conocemos la paridad de S 1 y S 2 , podemos calcular la paridad de S usando los siguientes hechos:

  1. Si S 1 y S 2 tienen la misma paridad, es decir, ambos tienen un número par de bits o un número impar de bits, su unión S tendrá un número par de bits.
  2. Por lo tanto, la paridad de S es XOR de las paridades de S 1 y S 2

La idea es crear una tabla de consulta para almacenar paridades de todos los números de 8 bits. Luego calcule la paridad del número entero dividiéndolo en números de 8 bits y usando los hechos anteriores. Pasos:

1. Create a look-up table for 8-bit numbers ( 0 to 255 )
   Parity of 0 is 0.
   Parity of 1 is 1.
   .
   .
   .
   Parity of 255 is 0.
2. Break the number into 8-bit chunks
   while performing XOR operations.
3. Check for the result in the table for
    the 8-bit number.

Dado que un número de 32 o 64 bits contiene un número constante de bytes, los pasos anteriores requieren un tiempo O(1). Ejemplo :

1. Take 32-bit number : 1742346774

2. Calculate Binary of the number : 
   01100111110110100001101000010110

3. Split the 32-bit binary representation into 
  16-bit chunks :
0110011111011010 | 0001101000010110 

4. Compute X-OR :
  0110011111011010
^ 0001101000010110
___________________
= 0111110111001100

5. Split the 16-bit binary representation 
   into 8-bit chunks : 01111101 | 11001100

6. Again, Compute X-OR :
  01111101
^ 11001100
___________________
= 10110001
10110001 is 177 in decimal. Check
 for its parity in look-up table :
Even number of 1 = Even parity.

Thus, Parity of 1742346774 is even.

A continuación se muestra la implementación que funciona tanto para números  de 32 bits como de 64 bits .

C++

// CPP program to illustrate Compute the parity of a
// number using XOR
#include <bits/stdc++.h>
 
// Generating the look-up table while pre-processing
#define P2(n) n, n ^ 1, n ^ 1, n
#define P4(n) P2(n), P2(n ^ 1), P2(n ^ 1), P2(n)
#define P6(n) P4(n), P4(n ^ 1), P4(n ^ 1), P4(n)
#define LOOK_UP P6(0), P6(1), P6(1), P6(0)
 
// LOOK_UP is the macro expansion to generate the table
unsigned int table[256] = { LOOK_UP };
 
// Function to find the parity
int Parity(int num)
{
    // Number is considered to be of 32 bits
    int max = 16;
 
    // Dividing the number into 8-bit
    // chunks while performing X-OR
    while (max >= 8) {
        num = num ^ (num >> max);
        max = max / 2;
    }
 
    // Masking the number with 0xff (11111111)
    // to produce valid 8-bit result
    return table[num & 0xff];
}
 
// Driver code
int main()
{
    unsigned int num = 1742346774;
 
    // Result is 1 for odd parity, 0 for even parity
    bool result = Parity(num);
 
    // Printing the desired result
    result ? std::cout << "Odd Parity" :
             std::cout << "Even Parity";
 
    return 0;
}

Java

// Java program to illustrate Compute the
// parity of a number using XOR
 
import java.util.ArrayList;
 
class GFG {
     
    // LOOK_UP is the macro expansion to
    // generate the table
    static  ArrayList<Integer> table = new ArrayList<Integer>();
    // Generating the look-up table while
    // pre-processing
    static void P2(int n)
    {
        table.add(n);
        table.add(n ^ 1);
        table.add(n ^ 1);
        table.add(n);
    }
     
    static void P4(int n)
    {
        P2(n);
        P2(n ^ 1);
        P2(n ^ 1);
        P2(n);
    }
     
    static void P6(int n)
    {
         P4(n);
         P4(n ^ 1);
        P4(n ^ 1);
        P4(n) ;
    }
     
    static void LOOK_UP()
    {
        P6(0);
        P6(1);
        P6(1);
        P6(0);
    }
     
 
     
     
    // Function to find the parity
    static int Parity(int num)
    {
     
        // Number is considered to be
        // of 32 bits
        int max = 16;
     
        // Dividing the number o 8-bit
        // chunks while performing X-OR
        while (max >= 8)
        {
            num = num ^ (num >> max);
            max = (max / 2);
        }
     
        // Masking the number with 0xff (11111111)
        // to produce valid 8-bit result
        return table.get(num & 0xff);
    }
 
     
    public static void main(String[] args) {
        // Driver code
        int num = 1742346774;
         
        LOOK_UP();
             
        //Function call
        int result = Parity(num);
         
        // Result is 1 for odd parity,
        // 0 for even parity
        if (result != 0)
            System.out.println("Odd Parity");
        else
            System.out.println("Even Parity");
    }
}
 
//This code is contributed by phasing17

Python3

# Python3 program to illustrate Compute the
# parity of a number using XOR
 
# Generating the look-up table while
# pre-processing
def P2(n, table):
    table.extend([n, n ^ 1, n ^ 1, n])
def P4(n, table):
    return (P2(n, table), P2(n ^ 1, table),
            P2(n ^ 1, table), P2(n, table))
def P6(n, table):
    return (P4(n, table), P4(n ^ 1, table),
            P4(n ^ 1, table), P4(n, table))
def LOOK_UP(table):
    return (P6(0, table), P6(1, table),
            P6(1, table), P6(0, table))
 
# LOOK_UP is the macro expansion to
# generate the table
table = [0] * 256
LOOK_UP(table)
 
# Function to find the parity
def Parity(num) :
 
    # Number is considered to be
    # of 32 bits
    max = 16
 
    # Dividing the number o 8-bit
    # chunks while performing X-OR
    while (max >= 8):
        num = num ^ (num >> max)
        max = max // 2
 
    # Masking the number with 0xff (11111111)
    # to produce valid 8-bit result
    return table[num & 0xff]
 
# Driver code
if __name__ =="__main__":
    num = 1742346774
     
    # Result is 1 for odd parity,
    # 0 for even parity
    result = Parity(num)
    print("Odd Parity") if result else print("Even Parity")
 
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)

C#

// C# program to illustrate Compute the
// parity of a number using XOR
using System;
using System.Collections.Generic;
 
class GFG {
 
    // LOOK_UP is the macro expansion to
    // generate the table
    static List<int> table = new List<int>();
   
    // Generating the look-up table while
    // pre-processing
    static void P2(int n)
    {
        table.Add(n);
        table.Add(n ^ 1);
        table.Add(n ^ 1);
        table.Add(n);
    }
 
    static void P4(int n)
    {
        P2(n);
        P2(n ^ 1);
        P2(n ^ 1);
        P2(n);
    }
 
    static void P6(int n)
    {
        P4(n);
        P4(n ^ 1);
        P4(n ^ 1);
        P4(n);
    }
 
    static void LOOK_UP()
    {
        P6(0);
        P6(1);
        P6(1);
        P6(0);
    }
 
    // Function to find the parity
    static int Parity(int num)
    {
 
        // Number is considered to be
        // of 32 bits
        int max = 16;
 
        // Dividing the number o 8-bit
        // chunks while performing X-OR
        while (max >= 8) {
            num = num ^ (num >> max);
            max = (max / 2);
        }
 
        // Masking the number with 0xff (11111111)
        // to produce valid 8-bit result
        return table[num & 0xff];
    }
 
    public static void Main(string[] args)
    {
        // Driver code
        int num = 1742346774;
 
        LOOK_UP();
 
        // Function call
        int result = Parity(num);
 
        // Result is 1 for odd parity,
        // 0 for even parity
        if (result != 0)
            Console.WriteLine("Odd Parity");
        else
            Console.WriteLine("Even Parity");
    }
}
 
// This code is contributed by phasing17

PHP

<?php
// PHP program to illustrate
// Compute the parity of a
// number using XOR
 
/* Generating the look-up
table while pre-processing
#define P2(n) n, n ^ 1, n ^ 1, n
#define P4(n) P2(n), P2(n ^ 1),
              P2(n ^ 1), P2(n)
#define P6(n) P4(n), P4(n ^ 1),
              P4(n ^ 1), P4(n)
#define LOOK_UP P6(0), P6(1),
                P6(1), P6(0)
 
LOOK_UP is the macro expansion
to generate the table
$table = array(LOOK_UP );
*/
 
// Function to find
// the parity
function Parity($num)
{
    global $table;
     
    // Number is considered
    // to be of 32 bits
    $max = 16;
 
    // Dividing the number
    // into 8-bit chunks
    // while performing X-OR
    while ($max >= 8)
    {
        $num = $num ^ ($num >> $max);
        $max = (int)$max / 2;
    }
 
    // Masking the number with
    // 0xff (11111111) to produce
    // valid 8-bit result
    return $table[$num & 0xff];
}
 
// Driver code
$num = 1742346774;
 
// Result is 1 for odd
// parity, 0 for even parity
$result = Parity($num);
 
// Printing the desired result
if($result == true)
        echo "Odd Parity" ;
    else
        echo"Even Parity";
 
// This code is contributed by ajit
?>

Javascript

//JavaScript program to illustrate Compute the
// parity of a number using XOR
 
// Generating the look-up table while
// pre-processing
function P2(n, table)
{
    table.push(n, n ^ 1, n ^ 1, n);
}
 
function P4(n, table)
{
    return (P2(n, table), P2(n ^ 1, table),
            P2(n ^ 1, table), P2(n, table));
}
 
function P6(n, table)
{
    return (P4(n, table), P4(n ^ 1, table),
            P4(n ^ 1, table), P4(n, table)) ;
}
 
function LOOK_UP(table)
{
    return (P6(0, table), P6(1, table),
            P6(1, table), P6(0, table));
}
 
// LOOK_UP is the macro expansion to
// generate the table
var table = new Array(256).fill(0);
LOOK_UP(table);
 
// Function to find the parity
function Parity(num)
{
 
    // Number is considered to be
    // of 32 bits
    var max = 16;
 
    // Dividing the number o 8-bit
    // chunks while performing X-OR
    while (max >= 8)
    {
        num = num ^ (num >> max);
        max = Math.floor(max / 2);
    }
 
    // Masking the number with 0xff (11111111)
    // to produce valid 8-bit result
    return table[num & 0xff] ;
}
 
// Driver code
var num = 1742346774;
     
//Function call
var result = Parity(num);
// Result is 1 for odd parity,
// 0 for even parity
console.log(result ? "Odd Parity" : "Even Parity");
 
 
// This code is contributed by phasing17

Producción:

Even Parity

Complejidad temporal: O(1). Tenga en cuenta que un número de 32 o 64 bits tiene un número fijo de bytes (4 en el caso de 32 bits y 8 en el caso de 64 bits). Este artículo es una contribución de Rohit Thapliyal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *