Inverser partie haute et partie basse d'un long - C++ - Programmation
Marsh Posté le 12-12-2002 à 11:55:59
>> return (lHighPart & lLowPart);
ça devrait être un | ...
ensuite, tu décales les parties de 16 bits chacune dans un sens :
long lHighPart = (_l & 0xFFFF0000) >> 16;
long lLowPart = (_l & 0x0000FFFF) << 16;
Marsh Posté le 12-12-2002 à 11:57:05
manque peut etre le decalage
Edit : Ce qui devrait donner
Code :
|
Marsh Posté le 12-12-2002 à 12:04:05
Taz@PPC a écrit : en espérant que tes long sont evidemment sur 32bits |
Sous Win32, c'est forcément sur 32 bits un long je crois !
Marsh Posté le 12-12-2002 à 12:05:39
Merci.
qd même j'arrive pas à comprendre pourquoi il faut décaler, pour la partie basse. Pour la partie haute je trouve ça logique, ms pr la partie basse g du mal. Enfin bref, merci beaucoup.
Marsh Posté le 12-12-2002 à 12:06:53
El_Gringo a écrit : Merci. |
ben parce que sinon tu vas avoir toute ton infos sur les 16 mêmes bits, et quand tu vas appliquer le | tu vas un peu perdre tout ca...
Marsh Posté le 12-12-2002 à 12:09:13
lorill a écrit : |
Ouais, mais le décalage de la partie haute devrait suffire.
comme j'ai fait ici :
http://forum.hardware.fr/forum2.ph [...] t=#t267915
Marsh Posté le 12-12-2002 à 12:10:22
Du coup, mon truc est presque bon !? il faudrais que je fasse comme ça, c ça ?
Code :
|
Marsh Posté le 12-12-2002 à 12:13:46
transformer 0x12345678 en 0x56781234
hi = 0x12345678 & ffff0000
hi = 0x12340000
lo = 0x12345678 & 0000fffff
lo = 0x00005678
faire un | de ces deux parties va donner le nombre d'origine.
hi = hi >> 16
hi = 0x00001234
lo = lo << 16
lo = 0x56780000
reverse = hi | lo = 0x56781234
Marsh Posté le 12-12-2002 à 12:14:55
El_Gringo a écrit : long lToReturn = lHighPart << 16; |
c'est l'inverse. tu n'as jamais fait de binaire ?
Marsh Posté le 12-12-2002 à 12:15:54
youdontcare a écrit : transformer 0x12345678 en 0x56781234 |
Génial, j'ai compris. Merci...
Marsh Posté le 12-12-2002 à 12:16:07
ReplyMarsh Posté le 12-12-2002 à 12:17:58
El_Gringo a écrit : ...si peu ! |
je te conseille un week-end romantique avec les opérations logiques ...
Marsh Posté le 12-12-2002 à 12:20:42
youdontcare a écrit : je te conseille un week-end romantique avec les opérations logiques ... |
Ce week end, c'est avce ma copine normalement, j'crois qu'elle le prendrais mal si j'décommandais pour les opérations logiques (jalousie oblige )
Merci à tous
Marsh Posté le 12-12-2002 à 13:21:39
heu... un long c pas codé sur 4 octets ?!?
Marsh Posté le 12-12-2002 à 13:43:03
blackgoddess a écrit : heu... un long c pas codé sur 4 octets ?!? |
c'est code sur (CHAR_BIT * sizeof long) bits exactement
Marsh Posté le 12-12-2002 à 14:03:51
blackgoddess a écrit : heu... un long c pas codé sur 4 octets ?!? |
Ben, dans ce cas là en tout cas, c'est ce qu'on considère...
32 bits quoi !
Marsh Posté le 12-12-2002 à 17:56:54
bin alors : l'auteur du sujet (el_gringo) dit :
inverser la partie haute et la partie passe d'un long.
Donc : passer les 4 premier octets en dernier et les 4 derniers en 1er. De sorte que 0xAB802453 devienne 0x2453AB80 (c pour un codage).
il a confondu octets avec chiffre hexa alors ?
enfin ... p-e si j'avais lu le topique en entier ca irait mieux ...
et si on fait :
long LongAInverser;
char tmp[2];
memcpy((void*)tmp,((void*)((&LongAInverser)+2),2);
memcpy(((void*)((&LongAInverser)+2),((void*)(&LongAInverser),2);
memcpy(((void*)(&LongAInverser),((void*)tmp,2);
(enfin c la théorie, g pas chercher à compiler ni rien, en fait ca serait de copier directement les 2 1ers octets à la place des 2 derniers et inversement)
Marsh Posté le 12-12-2002 à 19:12:03
Et comme ça, c'est pas plus propre ?
Code :
|
Marsh Posté le 13-12-2002 à 09:13:40
BlackGoddess a écrit : bin alors : l'auteur du sujet (el_gringo) dit : |
Ben, El_Gringo il pense que dans 0x11223344, 11 est un octet, 22 un autre, 33 encore un, et 44 le dernier...
Marsh Posté le 14-12-2002 à 02:44:33
Ça serait trivial si on disposait de l'opérateur de rotation:
Code :
|
Comme d'habitude ,il y a sûrement des librairies qui font ça très bien.
Marsh Posté le 14-12-2002 à 22:49:40
"si on disposait" mais alors ca existe ton code ?
Marsh Posté le 15-12-2002 à 04:16:00
<<< existe en Java il me semble.
Et il me semble aussi qu'il a d'abord demandé dans la rubrique Java, donc ça peut lui servir.
Pour disposer de la rotation, il faudrait une librairie capable d'utiliser les instructions assembleur si elles existent.
Marsh Posté le 15-12-2002 à 11:15:19
Musaran a écrit : <<< existe en Java il me semble. |
oui, il existe mais ce n'est pas la rotation, il me semble. je crois que c'est un histoire de décalage avec un injection de 1
Marsh Posté le 15-12-2002 à 12:09:22
qq1 pourrait-il me donner un lien ou m'expliquer les << >> je c kil le faut ds cout par exemple mais je n'ai jms compris sa signification.
Marsh Posté le 15-12-2002 à 12:23:45
ah ... bin qq1 pourrait-il m'expliquer les 2 ou me donner un lien svp ?
Marsh Posté le 15-12-2002 à 12:37:53
ok, d'accord, merci ))
je suppose que >> décale les bits vers la droite ?
Marsh Posté le 15-12-2002 à 12:39:07
et au fait pour j = i << 2
le bit tout à gauche passe à droite ou il est viré e tle bit rajouté à droite est tjs un 0 ?
Marsh Posté le 15-12-2002 à 16:00:15
BlackGoddess a écrit : et au fait pour j = i << 2 |
avec << les bits de droite sont perdus et des 0 sont injectés par la gauche. c'est valable pour les type signés et non signés (signed et unsigned)
pour >>, sur les types non-signés, des 0 sont injectés par la droite. les bits de gauche sont perdus.
par contre sur les types signés (int par exemple), les bits injectes a droite peuvent etre 1 ou 0 selon la machine: ce n'est pas défini par la norme, donc attention
Marsh Posté le 15-12-2002 à 18:38:21
Taz@PPC a écrit : avec << les bits de droite sont perdus et des 0 sont injectés par la gauche. c'est valable pour les type signés et non signés (signed et unsigned) |
Il me semblait que sur les types signés, >> devait conservé le signe et donc que >> recopie le bit de poit fort pour cela.
Marsh Posté le 16-12-2002 à 05:09:09
Taz@PPC a écrit : avec << les bits de droite sont perdus et des 0 sont injectés par la gauche. c'est valable pour les type signés et non signés (signed et unsigned) |
Grand boutiste, va !
Il faut permuter gauche et droite. Les poids faibles sont conceptuellement placés à droite, quel que soit le boutisme du système.
Marsh Posté le 16-12-2002 à 12:13:00
Musaran a écrit : Grand boutiste, va ! |
oui, parce que reellement, il faudrait savoir comment sont placées les barrettes memoires dans la machine
Marsh Posté le 16-12-2002 à 12:19:27
ah ... bien ... c koi le boutisme ?
Marsh Posté le 12-12-2002 à 11:45:13
Voila ce que je cherche à faire :
inverser la partie haute et la partie passe d'un long.
Donc : passer les 4 premier octets en dernier et les 4 derniers en 1er. De sorte que 0xAB802453 devienne 0x2453AB80 (c pour un codage).
J'extrait la partie haut et la partie basse de mon long de la façon suivante :