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