Dans la récente interview, j’ai eu une question comme celle-ci:
Given a ssortingng value, find out its 127th bit and reset it, do this in C language
Reset means if that particular bit is 0 change to 1 and vice versa
Je n’ai pas trouvé d’algorithme pour cela, mais je veux savoir comment on pourrait résoudre cela en langage C
Après avoir obtenu la réponse de quelques-uns, j’ai essayé ceci:
#include void main() { char *str="anto"; str[15] ^= 0x80; printf("%s",str); }
Je reçois la sortie en tant que: anto
. Maintenant, j’ai la grève dans ma tête qui change un peu ne change pas la sortie?
En supposant que char
soit 8 bits et que l’endian est little-endian:
char *str = ...; str[15] ^= 0x80;
Cela retournera le 127ème bit.
MODIFIER:
Si le bit-endian est big-endian, utilisez plutôt 0x01
.
La réponse dépend également de la façon dont les bits sont numérotés. Si nous commençons à numéroter à partir de 0, utilisez 0x80
. Si nous 0x40
partir de 1, nous utilisons 0x40
. ( 0x01
et 0x02
pour big-endian)
EDIT 2: Voici le cas général: (avec les mêmes hypothèses)
char *str = ...; int bit = 127; int index = bit / 8; // Get the index int chbit = bit % 8; // Get which bit in the char int mask = 1 << chbit; // Build the mask str[index] ^= mask; // XOR to flip the bit.
Pour basculer n’importe quel bit dans une chaîne:
#include void flip_bit(char *x, int bit_no) { (x + bit_no/CHAR_BIT) ^= 1 << bit_no%CHAR_BIT; }
Explication: La recherche du bit_no: le bit est effectué en deux étapes:
D'abord autant d'octets que nécessaire (division entière): (x + bit_no / CHAR_BIT)
Ensuite, autant de bits qui restnt. Ceci est effectué en décalant de 1 bit par aucun bit% CHAR_BIT (le rest).
Enfin basculer le bit en utilisant l'opérateur xor (^).
La première est que vous demandez est dit en tant que bascule pas réinitialiser okey
Pour basculer un peu
L’opérateur XOR (^) peut être utilisé pour basculer un bit.
number ^= 1 << x;
Cela va basculer bit x. pour plus d'informations, pensez à lire ceci
Maintenant, comme vous le savez, la chaîne est le nombre de caractères et la taille d'un caractère est égale à 1 octet.
Vous devez créer un masque de bits, pour le n-ème bit, le masque de bits sera:
char *bitmask = 2^(n-1);
et pour retourner le bit xor la chaîne et le bitmask:
ssortingng ^= bitmask;