Establecer, borrar y alternar un bit dado de un número en C

Dado un número N, la tarea es establecer, borrar y alternar el k-ésimo bit de este número N.

  • Establecer un bit significa que si el k-ésimo bit es 0, entonces configúrelo en 1 y si es 1, déjelo sin cambios.
  • Limpiar un bit significa que si el k-ésimo bit es 1, entonces límpielo a 0 y si es 0, déjelo sin cambios.
  • Alternar un bit significa que si el K-th bit es 1, entonces cámbielo a 0 y si es 0, cámbielo a 1.

Ejemplos:

Input: N = 5, K = 1
Output: 
Setting Kth bit: 5
Clearing Kth bit: 4
Toggling Kth bit: 4
Explanation: 
5 is represented as 101 in binary
and has its first bit 1, so 
setting it will result in 101 i.e. 5.
clearing it will result in 100 i.e. 4.
toggling it will result in 100 i.e. 4.

Input: N = 7, K = 2
Output: 
Setting Kth bit: 7
Clearing Kth bit: 5
Toggling Kth bit: 5
Explanation: 
7 is represented as 111 in binary
and has its second bit 1, so 
setting it will result in 111 i.e. 7.
clearing it will result in 101 i.e. 5.
toggling it will result in 101 i.e. 5.

Acercarse:

A continuación se muestran los pasos para establecer, borrar y alternar K-ésimo bit de N:

Ajuste un poco

  • Dado que todos sabemos que realizar OR bit a bit de cualquier bit con un bit establecido da como resultado un bit establecido, es decir
    Any bit <bitwise OR> Set bit = Set bit
    
    which means,
    0 | 1 = 1
    1 | 1 = 1
    
  • Entonces, para establecer un bit, la mejor idea es realizar un OR bit a bit del número con un bit establecido.
    N = N | 1 << K
    OR
    N |= 1 << K
    
    where K is the bit that is to be set
    

aclarando un poco

  • Dado que AND bit a bit de cualquier bit con un bit de reinicio da como resultado un bit de reinicio, es decir
    Any bit <bitwise AND> Reset bit = Reset bit
    
    which means,
    0 & 0 = 0
    1 & 0 = 0
    
  • Entonces, para borrar un poco, la mejor idea es realizar un AND bit a bit del número con un bit de reinicio.
    n = n & ~(1 << k)
    OR
    n &= ~(1 << k)
    
    where k is the bit that is to be cleared
    

alternar un poco

  • Dado que XOR de un bit activado y desactivado da como resultado un bit activado y XOR de un bit activado y activado da como resultado un bit desactivado. Por lo tanto, realizar XOR bit a bit de cualquier bit con un bit establecido da como resultado un cambio de ese bit, es decir
    Any bit <bitwise XOR> Set bit = Toggle
    
    which means,
    0 ^ 1 = 1
    1 ^ 1 = 0
    
  • Entonces, para alternar un poco, la mejor idea es realizar un XOR bit a bit del número con un bit de reinicio.
    n = n ^ 1 << k
    OR
    n ^= 1 << k
    
    where k is the bit that is to be cleared
    

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

// C program to set, clear and toggle a bit
  
#include <stdio.h>
  
// Function to set the kth bit of n
int setBit(int n, int k)
{
    return (n | (1 << (k - 1)));
}
  
// Function to clear the kth bit of n
int clearBit(int n, int k)
{
    return (n & (~(1 << (k - 1))));
}
  
// Function to toggle the kth bit of n
int toggleBit(int n, int k)
{
    return (n ^ (1 << (k - 1)));
}
  
// Driver code
int main()
{
    int n = 5, k = 1;
  
    printf("%d with %d-th bit Set: %d\n",
           n, k, setBit(n, k));
    printf("%d with %d-th bit Cleared: %d\n",
           n, k, clearBit(n, k));
    printf("%d with %d-th bit Toggled: %d\n",
           n, k, toggleBit(n, k));
    return 0;
}
Producción:

5 with 1-th bit Set: 5
5 with 1-th bit Cleared: 4
5 with 1-th bit Toggled: 4

Publicación traducida automáticamente

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