0
votes

Comment supprimer le nième chiffre hexadécimal d'un numéro entier sans utiliser de strings?

considérer une valeur d'entier hexadécimale telle que n = 0x12345 , comment obtenir 0x1235 résulter en faisant supprimer (n, 3) ( Big Endian)?

Pour les entrées ci-dessus, je pense que cela peut être obtenu en effectuant des étapes bitwising:

  • partita = extraire la pièce de l'index 0 à cibleindex - 1 (doit renvoyer 0x123 ); / li>
  • partie = extraire la pièce de Targedex + 1 à longueur (valeur) - 1 ( 0x5 ) ;
  • résultat, alors, peut être exprimé par ((longueur Parta << (partie << (Partb) | partie) , donnant le résultat 0x1235 .

    Cependant, je suis toujours confondu dans la manière de la mettre en œuvre, une fois que chaque chiffre hexagonal occupe 4 espaces. En outre, je ne sais pas un bon moyen de récupérer la longueur des chiffres.

    Cela peut être facilement fait avec des chaînes, mais je dois l'utiliser dans un contexte de milliers d'itérations et ne pense pas que les chaînes sont une bonne idée de choisir.

    Alors, qu'est-ce qu'un bon moyen de supprimer sans chaînes?


0 commentaires

3 Réponses :


1
votes

Solution:

Remplacez les opérations en utilisant 10 avec des opérations à l'aide de 16. P>

Démo h1>

Utilisation du bitwise: PRE>

n = parseInt(12345, 16);
temp = n;
length = 0;

// Find length
while (temp != 0) {
    length++;
    temp = Math.floor(temp / 16);
}
console.log("Length of the number: " + length);

// Remove digit at index 3
m = n;
index = 3;
for (i = index + 1; i <= length; i++) {
    m = Math.floor(m / 16);
}
m *= 1 << ((length - index - 1) << 2);
m += n % (1 << ((length - index - 1) << 2));
console.log("The number after removing digit at index " + index + ": 0x" + m.toString(16));


8 commentaires

Faire cela avec n = 0x12345 et index = 2 donne 165 au lieu de 1245 et avec n = 0x11233455 et index = 4 donne 11685 au lieu de 1123455 . Fonctionne uniquement pour n = 0x12345 et index = 3 ?


@Lucassousa - J'ai corrigé le problème. N'hésitez pas à commenter en cas d'autre problème.


Vraiment incroyable! Travaillé bien dans tous mes tests. Merci.


Quelqu'un peut-il fournir une version javascript de cette réponse?


Je ne suis pas bon à JavaScript mais je vais essayer de poster la version JavaScript.


@Lucassousa - J'ai posté la version JavaScript. Puisque JavaScript n'est pas mon domaine d'expertise, j'ai eu un peu mal mais enfin, j'ai pu la faire.


Merci @arvind. J'avais peur avec les castings mais ça marche bien.


Génial! Te souhaite du succès!



1
votes

Cela fonctionne en écrivant une méthode pour retirer de la droite mais en ajustant le paramètre à supprimer de la gauche. Le bonus est qu'un retirer de la droite est également disponible pour une utilisation. Cette méthode utilise LIPS code> pour maximiser la longueur de la valeur hexagonale.

    static long remove(long v, int i) {
        int offset = ((67 - Long.numberOfLeadingZeros(v))>>2) - i - 1;
        long m = (-1L >>> (4*(16 - offset) - 1)) >> 1;
        return ((v >>> 4) & ~m) | (v & m);
    }


5 commentaires

Puis-je supposer que gauche / droite est l'Endian Commander?


J'imagine. Il décrit simplement de quel côté la valeur est comptée.


Lucas, j'ai écrit une version bit changeante qui fonctionne très bien. Mais je ne veux pas voler le tonnerre de Falk pour que je lui donne le temps de le réparer.


Lucas, j'ai ajouté ma version à l'aide de Bit Shifting et espérait que vous pourriez vérifier. Cela peut être un TAD plus lent puisqu'il fonctionne avec des longs pour permettre des arguments plus larges.


Jolie solution et une excellente explication aussi! Merci. :)



1
votes

Semblable à l'idée que vous décrivez, cela peut être fait en créant un masque pour la partie supérieure et la partie inférieure, en déplaçant la partie supérieure, puis réassemblant. xxx

où ">>>" est un décalage non signé.

comme une note, si 0 indique le chiffre hexaginal le plus élevé dans un mot de 32 bits indépendamment de l'entrée. , c'est beaucoup plus simple: xxx


10 commentaires

J'aime l'idée et j'ai écrit l'un de mes propres qui sont différents. Mais malheureusement, de mes tests au moins, cela ne semble pas travailler pensé que vous voudriez savoir afin que vous puissiez le tester vous-même et apporter des modifications.


Pourriez-vous s'il vous plaît dites-moi pour quelle contribution vous obtiendrez un mauvais résultat?


Essayez-les. Selon l'OP, 0 devrait être le premier à gauche, 1, le second et ainsi de suite. System.out.printf ("% x% n", supprimer (0xabcdef, 0)); System.out.printf ("% x% n", supprimer (0xabcdef, 1)); System.out.printf ("% x% n", supprimer (0xabcdef, 2)); System.out.printf ("% x% n", supprimer (0xabcdef, 3));


Ok, je supposais que la numérotation commence par 0 comme le plus haut groupe 4 bits (la question mentionne "Big-Endian" qui est exactement cela). Il semble que vous assumez quelque chose de différent, même si je ne suis pas sûr de quoi.


Je viens de passer par la première phrase et l'exemple avec l'appel de la méthode. J'ai ignoré la déclaration "Big-Endian". Spécification 3 Supprimé le 4 du nombre, donc je présumé que l'OP comptait à partir de la gauche à partir de 0.


Très intelligent! Cependant, en appelant supprimer (0x12345, 2) il renvoie 12345 au lieu de 1245 . En outre, Supprimer (0x112334, 0) retourne 12334 et ainsi de suite. Même en ignorant Endian Commander, il semble ne pas fonctionner. Pouvez-vous réparer?


Avec deuxième argument "2", il supprime le troisième du haut de 8 chiffres hexagonaux (par exemple, supprimer (0x12345678, 2) rendements 0x1245678). Je ne suis toujours pas sûr de ce que vous voulez réellement. Qu'est-ce qui est supprimé (0x112334, 0) censé céder?


avec deuxième argument "2", il supprime le troisième du haut de 8 chiffres hexadémiques (par exemple, supprimer (0x12345678, 2). C'est correct. Mais essayez-le avec 0x1234567, puis 0x123456, et ainsi de suite . Il devrait toujours supprimer le 3


Je vois, j'ai ajouté une version pour cela. Malheureusement, il est beaucoup plus impliqué, car il est déjà trouvé que le plus haut jeu de jeu n'est pas facile.


Résultats corrects et performances incroyables! J'ai juste essayé d'appeler Supprimer (0x112334, 0) integer.max_value fois et n'a pris que 7 millisecondes.