Técnica de manipulación de bits para reemplazar arrays booleanas de tamaño fijo inferior a 64

La complejidad del espacio es el activo más subestimado por los programadores. Apenas se puede ver un límite de memoria excedido (MLE) al enviar una solución. Pero ahorrar memoria es lo más importante que debe cuidar un programador. Si uno necesita crear una aplicación para un usuario, debe hacerse tan eficiente en memoria como sea posible. Las arrays
booleanas se han utilizado como contenedor para resolver diferentes problemas. Este artículo se centra en discutir las alternativas a las arrays booleanas.

Variable entera como contenedor

En general, la variable Integer tiene 4 bytes (se tiene en cuenta C++), lo que da como resultado 32 bits booleanos para representar un número. Por ejemplo, para representar 10, los bits booleanos se pueden escribir como:

int a = 10

En memoria
: 00000000000000000000000000001010 (Binario de 10 en entero de 32 bits)

Esto significa que uno puede usar estos bits como un valor booleano dentro de una array booleana de tamaño 32. Se puede usar un número entero de 64 bits para aumentar el tamaño si es necesario.

¿Cómo usar la variable Integer como contenedor?

Analicemos en detalle cómo usar la variable Integer como contenedor.

El primer paso es inicializar la variable entera como 0, para obtener el contenedor booleano de tamaño 32 con todos los bits inicialmente falsos.

Establecer un bit en verdadero:
establezca cualquier bit en verdadero para cualquier ubicación deseada mediante el uso de operadores bit a bit como operadores AND, NOT, OR y SHIFT . Por ejemplo, para establecer un bit en verdadero en la posición 7-

Use shift y el operador OR bit a bit para hacer que el i -ésimo bit sea 1 (verdadero)
int a = 0;
a |= (1 << 7);
Aquí a se convertirá en: 000000000000000000000000010000000
                                                                                              ↑
                                                                                              0 th bit

Paso 1: Primero mueva 1 que es (..0001) en binario a 7 pasos restantes para hacerlo como (..10000000).
Paso 2: A continuación, hazlo bit a bit o con el número. 
Paso 3: Como 1 O 0 = 1 y 1 O 1 = 1, esto establecerá el bit 7 a uno sin afectar a otros bits.

Establezca un bit en falso:

Por ejemplo, para restablecer un bit a falso en la posición 7

Utilice shift y el operador NOT y AND bit a bit para hacer que el i -ésimo bit sea 0 (falso).
int a = 0;
a |= (1 << 7); // Para establecer el séptimo bit
a &= ~(1 << 7); // Para restablecer el bit 7

Paso 1: Primero mueva nuestro 1 que es (..0001) en binario a 7 pasos a la izquierda para convertirlo en (..10000000).
Paso 2: invierta los bits para que se vean como (… 1101111111).
Paso 3: Realice la operación AND con el número.
Paso 4: Como 1 Y 0 = 0, 0 Y 0 = 0, 1 Y 1 = 1, esto establecerá el bit 7 a uno sin afectar a otros bits.

Obtener el valor de i th bit:

Por ejemplo, para obtener el valor del 7º bit-

Utilice el operador AND para imprimir.
int a = 0;
a |= (1<<7); // Para configurar el 7mo bit
Print((a>>7)&1); // esto imprimirá 1(Verdadero)
a &= ~(1<<7); // Para restablecer el 7mo bit
Print((a>>7)&1); // esto imprimirá 0 (falso)

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program to implement
// the above approach
#include<iostream>
using namespace std;
 
// Driver code
int main()
{
  // This is an integer variable
  // used as a container
  int myBoolContainer = 0;
   
  // 7th bit will be used for sample
  int workingBit = 7;
   
  // Setting ith bit
  cout << "Setting " <<
           workingBit << "th bit to 1\n";
   
  myBoolContainer |= (1 << workingBit);
   
  // Printing the ith bit
  cout << "Value at " << workingBit <<
          "th bit = " <<
          ((myBoolContainer >> workingBit) & 1) <<
          "\n\n"; 
   
  // Resetting the ith bit
  cout << "Resetting " << workingBit <<
          "th bit to 0\n";
  myBoolContainer &= ~(1 << 7);
   
  // Printing the ith bit
  cout << "Value at " << workingBit <<
          "th bit = " <<
          ((myBoolContainer >> workingBit) & 1);
}

Java

// Java program to implement
// the above approach
import java.io.*;
 
// Driver code
class GFG
{
    public static void main (String[] args)
    {
          // This will be the integer variable
        // used as boolean container
        int myBoolContainer = 0;
   
        // 7th bit will be used for sample
        int workingBit = 7;
 
        // Setting ith bit
        System.out.println(
        "Setting " + workingBit +
        "th bit to 1");
       
        myBoolContainer |= (1 << workingBit);
 
        // Printing the ith bit
        System.out.println(
        "Value at " + workingBit+"th bit = " +
        ((myBoolContainer >> workingBit) & 1) +
        "\n"); 
 
        // Resetting the ith bit
        System.out.println(
        "Resetting " + workingBit +
        "th bit to 0");
         
        myBoolContainer &= ~(1 << 7);
 
        // Printing the ith bit
        System.out.println(
        "Value at " + workingBit +
        "th bit = " +
        ((myBoolContainer >>workingBit) & 1));
    }
}

Python

# Python program to implement
# the above approach
# This will be the integer variable
# used as boolean container
myBoolContainer = 0;
   
# 7th bit will be used as example
workingBit = 7;
 
# Setting ith bit
print("Setting " + str(workingBit) +
      "th bit to 1");
myBoolContainer |= (1 << workingBit);
 
# Printing the ith bit
print("Value at " + str(workingBit) +
      "th bit = " + str((myBoolContainer >>
                         workingBit) & 1) + "\n"); 
 
# Resetting the ith bit
print("Resetting " + str(workingBit) +
      "th bit to 0");
myBoolContainer &= ~(1 << 7);
 
# Printing the ith bit
print("Value at " + str(workingBit) +
      "th bit = " + str((myBoolContainer >>
                         workingBit) & 1))

C#

//C# code for the above approach
using System;
public class GFG {
 
    static public void Main()
    {
 
        // This will be the integer variable
        // used as boolean container
        int myBoolContainer = 0;
 
        // 7th bit will be used for sample
        int workingBit = 7;
 
        // Setting ith bit
        Console.WriteLine("Setting " + workingBit
                          + "th bit to 1");
 
        myBoolContainer |= (1 << workingBit);
 
        // Printing the ith bit
        Console.WriteLine(
            "Value at " + workingBit + "th bit = "
            + ((myBoolContainer >> workingBit) & 1) + "\n");
 
        // Resetting the ith bit
        Console.WriteLine("Resetting " + workingBit
                          + "th bit to 0");
 
        myBoolContainer &= ~(1 << 7);
 
        // Printing the ith bit
        Console.WriteLine(
            "Value at " + workingBit + "th bit = "
            + ((myBoolContainer >> workingBit) & 1));
    }
}
 
// This code is contributed by Potta Lokesh

Javascript

// Javascript program to implement
// the above approach
// This is an integer variable
// used as a container
var myBoolContainer = 0;
 
// 7th bit will be used sample
var workingBit = 7;
   
// Setting ith bit
console.log("Setting " + workingBit +
            "th bit to 1\n");
myBoolContainer |= (1 << workingBit);
   
//Printing the ith bit
console.log("Value at " + workingBit +
            "th bit = "+ ((myBoolContainer >>
                           workingBit) & 1) + "\n\n");
   
// Resetting the ith bit
console.log("Resetting " + workingBit +
            "th bit to 0\n");
myBoolContainer &= ~(1 << 7);
   
// Printing the ith bit
console.log("Value at " + workingBit +
            "th bit = " + ((myBoolContainer >>
                            workingBit) & 1));
Producción

Setting 7th bit to 1
Value at 7th bit = 1

Resetting 7th bit to 0
Value at 7th bit = 0

Resolver strings de pangrama:

Resolvamos el problema de las strings de pangrama usando el enfoque anterior.

Acercarse:

Se sabe que los alfabetos ingleses del rango de minúsculas desde (az) tienen un conteo de no más de 26. Entonces, en este enfoque, se puede usar una array bool de tamaño constante. Esto optimizará la complejidad espacial del código.

A continuación se muestra la implementación de las strings de pangrama utilizando una array booleana:

C++

// C++ program to implement
// the above approach
#include <iostream>
using namespace std;
 
bool checkIsPanagram(string sentence)
{
    // Initializing the container
    int n = 0;
   
    for(char &x:sentence)
    {
        // Checking that the char
        // is Alphabetic
        if(isalpha(x)) 
           
            // setting ith bit to 1
            // if char is 'a' then this will
            // set 0th bit to 1 and so on
            n |= (1 << (tolower(x) - 'a'));           
    }
   
    // decimal number for all ones in last
    // 26 bits in binary is 67108863
    return n == 67108863;
}
 
// Driver code
int main()
{
  string s =
  "Pack mY box witH fIve dozen liquor jugs";
  cout << checkIsPanagram(s);
}

Java

// Java program to implement
// the above approach
import java.io.*;
class Panagram
{
  public boolean checkIsPanagram(
                 String sentence)
  {
      // Initializing the container
      int n = 0;
     
        int size = sentence.length();
        for(int i = 0; i < size; i++)
        {
            // Storing current character
            // in temp variable
            char x = sentence.charAt(i);
           
            // checking that the char is Alphabetic
            if(Character.isAlphabetic(x))
            {
                // setting ith bit to 1
                // if char is 'a' then this will
                // set 0th bit to 1 and so on
                n |= (1 << (Character.toLowerCase(x) - 'a'));    
            }
        }
     
        // Decimal number for all ones in last
        // 26 bits in binary is 67108863
        return (n == 67108863);
  }
};
 
// Driver code
class GFG
{
    public static void main (String[] args)
    {
      String s =
      "Pack mY box witH fIve dozen liquor jugs";
      Panagram panagram = new Panagram();
      System.out.println(
             panagram.checkIsPanagram(s));
    }
}

Python

# Python program to implement
# the above approach
def isPanagram(sentence):
   
    # Initializing the container
    n = 0
     
    for char in sentence:
           
        # Checking that the char
        # is Alphabetic
        if char.isalpha():
           
            # setting ith bit to 1
            # if char is a then this will
            # set 0th bit to 1 and so on
            n |= (1 << (ord(char.lower()) -
                        ord('a')))
             
     
    # Decimal number for all ones in
    # last 26 bits in binary is 67108863
    return n == 67108863
 
sentence =
"Pack mY box witH fIve dozen liquor jugs"
print(isPanagram(sentence))

C#

// C# program to implement
// the above approach
using System;
 
class Panagram
{
  public bool checkIsPanagram(
                 String sentence)
  {
     
      // Initializing the container
      int n = 0;
     
        int size = sentence.Length;
        for(int i = 0; i < size; i++)
        {
           
            // Storing current character
            // in temp variable
            char x = sentence[i];
           
            // checking that the char is Alphabetic
            if(char.IsLetter(x))
            {
               
                // setting ith bit to 1
                // if char is 'a' then this will
                // set 0th bit to 1 and so on
                n |= (1 << (char.ToLower(x) - 'a'));    
            }
        }
     
        // Decimal number for all ones in last
        // 26 bits in binary is 67108863
        return (n == 67108863);
  }
};
 
// Driver code
public class GFG
{
    public static void Main(String[] args)
    {
      String s =
      "Pack mY box witH fIve dozen liquor jugs";
      Panagram panagram = new Panagram();
      Console.WriteLine(
             panagram.checkIsPanagram(s));
    }
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
// javascript program to implement
// the above approach
function checkIsPanagram(sentence)
  {
   
      // Initializing the container
      var n = 0;
     
        var size = sentence.length;
        for(var i = 0; i < size; i++)
        {
            // Storing current character
            // in temp variable
            var x = sentence[i];
           
            // checking that the char is Alphabetic
            if(isAlphabetic(x))
            {
                // setting ith bit to 1
                // if char is 'a' then this will
                // set 0th bit to 1 and so on
                n = n | (1 << (x.charCodeAt(0)- 'a'.charCodeAt(0)));    
            }
        }
     
        // Decimal number for all ones in last
        // 26 bits in binary is 67108863
        return (n == 67108863);
  }
function isAlphabetic(str)
{
    return /^[a-zA-Z()]+$/.test(str);
}
 
// Driver code
var s =
"Pack mY box witH fIve dozen liquor jugs";
document.write(checkIsPanagram(s));
 
// This code is contributed by 29AjayKumar
</script>
Producción

1

Publicación traducida automáticamente

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