Au Niveau Du Bit De Concaténation
J'ai le texte suivant:
char *pointer = decimal_to_binary(192) //yields 11000000
char *pointer2 = decimal_to_binary(168) //yields 10101000
Je suis en train de concat en:
1100000010101000
J'ai été référencement: Concaténer des nombres binaires de différentes longueurs et je suis actuellement en utilisant:
unsigned long pointer3 = (*pointer << 16) | *pointer2;
qui donne à la sortie:
1100010000000000110001
Ce que je fais mal?
- considérant 32 grande machine, avez-vous essayé
(*pointer << 32) | *pointer2
- Êtes-vous sûr qu'il y a le dernier 0 sur le résultat que vous voulez? Si tout ce que vous voulez, c'est la concaténation de deux pointeurs, il semble que le dernier 0 est dans l'excès...
- Fixe. merci Claudio.
- Votre code n'a même pas compiler
- Je pense que la question est un peu déroutant... avez-vous envie de concaténer une chaîne de caractères qui représente le nombre binaire ou les bits d'eux-mêmes (un entier)? Le titre de "bit-à-bit de concaténation" m'a fait penser que tu voulais l'opération sur un certain nombre et vous avez juste eu quelques erreurs de syntaxe, mais après @JonathanLeffler réponse je soupçonne que vous voulez juste concaténer des chaînes de caractères représentant les nombres binaires... Quel est le vrai but?
Vous devez vous connecter pour publier un commentaire.
Vous ne vous montrez pas comment vous imprimer quoi que ce soit, ce qui le rend difficile à interpréter à votre question. Cependant, cette affirmation est irrémédiablement cassé en ce qu'il ne fait rien pour concaténer les chaînes de caractères pointée par
pointer
etpointer2
:C'est le premier personnage que
pointer
points (un1
) et les quarts de la valeur à gauche 16 bits, puis ajoute (rup) dans le premier personnage quepointer2
points (un autre1
), et attribue à l'entier donc le format de la mal nomméepointer3
. Ainsi, on obtient la valeur:La question prend une certaine interprétation, mais en faisant quelques plausible (mais pas nécessairement exacte) des hypothèses, ce code pourrait faire ce que vous êtes après:
De sortie:
Noter que le code à l'aide de
decimal_to_binary()
ne pas prendre soin d'éviter de (mis)à l'aide de pointeurs null. La conception dedecimal_to_binary()
est également à moins de stellaires; ceuxfree()
appels sont facilement oubliés. Une meilleure conception de l'être:où le code appelant fournit le tampon dans lequel la sortie binaire est écrit. Il ya aussi d'autres façons d'écrire la boucle dans
decimal_to_binary()
; certains pourraient même être plus efficace que celui qui a été choisi ici.char *pointer = decimal_to_binary(192);
, alors je suppose quedecimal_to_binary()
est de retour unechar *
, ce qui signifiea string
. Si vous aviezunsigned char number1 = decimal_to_binary(192);
(qui pourrait éliminer l'appel de la fonction et être écritunsigned char number1 = 192;
), et de même pourunsigned number2 = 168;
, alors vous pouvez les combiner avecunsigned short number3 = (number1 << 8) | number2;
. Si vous voulez de bonnes réponses, un bon SSCCE (Bref, Autonome, Exemple Correcte) qui montre ce que vous essayez de faire.char *
les types utilisés. Vous prenez un point de vue alternatif, basé sur la mention des opérations bit à bit. Votre choix peut très bien être meilleur que le mien — la question ne devrait certainement être mieux écrit pour le rendre plus clair ce qui est vraiment voulu.Ok, d'abord, vous ne devriez pas initialiser un pointeur et un entier; le compilateur va probablement vous avertir comme ceci:
Si vous n'êtes pas familier avec la notation hexadécimale, veuillez vous référer à cette; vous verrez la conversion de binaire en hexadécimal est beaucoup plus simple que de nombre décimal en hexadécimal, par exemple.
Si vous voulez représenter ces 8 bits on peut attribuer directement à
unsigned char
variables, comme je l'ai fait ici-bas (collez ce code dans un fichier "test.c", par exemple):Vous pouvez le compiler avec
gcc -o test test.c
, qui sort cette lors de l'exécution à:0xc0a8
(c'est le même que 1100000010101000).Si vous attribuez le nombre de pointeurs comme vous l'avez fait, vous obtiendrez probablement un "segmentation fault" ou "violation d'accès" lorsque vous essayez de déréférencer avec
*pointer
et*pointer2
, parce que cela signifie que vous souhaitez que la valeur stockée à l'adresse de pointeur, ce qui, probablement, ne réside pas dans votre programme de l'espace d'adresse.Depuis
result
est un long (32 bits), il peut certainement retenir votre 16 bits, maisnum1
etnum2
êtreunsigned char
, de sorte que lorsque vous shift gauche et OU leur il ne veut pas rendre la chose de négatif en un nombre binaire signé la plus à gauche du jeu de bit à 1 signifie qu'il est un nombre négatif, donc si vous utilisez un simplechar
au lieu de cela il va signer étendre le résultat sur 32 bits, donc il reste négative:0xffffffa8
D'abord seulement affecter un certain nombre de pointeur comme
unsigned long pointer3 = *pointer;
après cette maj gauche cette
pointer3
16 fois.pinter3=pointer3<<16;
pointer3=pointer3|*pointer2;
cela fonctionne je pense que
Il n'y a pas besoin de passer par 16 comme vous le faites dans
pointeur ne doit être déplacé par 8.
Code suivant va réaliser ce que vous essayez de faire.
Celui-ci semble facile à comprendre)