J'essaie actuellement de construire une table de recherche pour un arbre Huffman à l'aide d'un algorithme de traversée pré-entraînement simple simple, mais je suis resté bloqué effectuer des opérations de bits très basiques. Le code Psuedo suit:
void preOrder(huffNode *node, int bit) //not sure how to represent bit { if (node == NULL) return; (1) bit = bit + 0; //I basically want to add a 0 onto this number (01 would go to 010) preOrder(node->getLeft(), bit); (2) bit = bit - 0 + 1; //This should subtract the last 0 and add a 1 (010 would go to 011) preOrder(node->getRight()); }
3 Réponses :
Sauf si vos séquences binaires deviendront plus longues que le nombre de bits dans un int, vous pouvez simplement utiliser un int. p>
Pour ajouter un 0 à la fin de la représentation actuelle de A, vous pouvez utiliser un << 1 p>
Pour remplacer un 0 à la fin de la représentation actuelle d'A avec un 1, vous pouvez utiliser A ^ = 1 p>
Notez que pour utiliser un Int de cette manière, vous devrez également garder une trace de l'endroit où vous commencez, de sorte que, si vous en avez, la valeur 0x0, vous pouvez savoir laquelle de 0, 00 000 000 , ... c'est. P>
Voici quelques exemples de base d'opérations binaires. J'ai utilisé surtout des opérations sur place ici.
char bitstr[33]; __int64 * intbits = (__int64*)bitstr; intbits[0] = *(__int64*)lookup[(val >> 24) & 0xff]; intbits[1] = *(__int64*)lookup[(val >> 16) & 0xff]; intbits[2] = *(__int64*)lookup[(val >> 8) & 0xff]; intbits[3] = *(__int64*)lookup[val & 0xff]; bitstr[32] = 0;
Wow pas mal du tout, j'essayais de faire de jolies choses funky. Merci beaucoup!
Question rapide .. J'ai fini par revenir à cela, et pourquoi pas simplement imprimer un nombre binaire en tant que tel: pour (int i = longueur; i> 0; i--) {COUT << BIT% 2 << " ; bit / = 2; }
Bon sang je ne peux pas poster le code dans les commentaires .. mais essayez de regarder cela pour une boucle vraiment rapidement. N'est-il pas beaucoup plus facile d'imprimer un nombre binaire comme ça ou est-ce désavantageux d'une manière ou d'une autre?
Bien sûr ... tout ce qui fonctionne pour vous. J'ai impliqué mon chemin était l'un des nombreux. Tout ce que je me sentais comme écrire à l'époque. Je préfère éviter plusieurs appels à une fonction de sortie du flux, je l'ai donc généré dans une chaîne pour une utilisation plus générale. Si vous voulez une opération rapide, vous généreriez probablement dans une chaîne, mais pas autant autant de GUFF que j'ai ci-dessus. Vous éviteriez également les opérateurs modulo et divisez à moins que vous n'ayez une bonne foi dans les optimisations de votre compilateur.
J'ai ajouté des alternatives que vous pourriez être intéressée si vous essayez de faire du code rapide.
Opérations dans votre code:
(1) bit = bit << 1; (2) bit = bit|1;