Partage
  • Partager sur Facebook
  • Partager sur Twitter

Échanger deux bits d'un nombre

Sujet résolu
27 juillet 2017 à 22:51:18

Salut

J'ai essayé avec ce code:

void swapBit(unsigned char* numbA, unsigned char* numbB, short bitPosition)//bitPosition 0-7
{
	int oneShift = 1 << bitPosition;

	int bitA = *numbA & oneShift;
	int bitB = *numbB & oneShift;

	if (bitA)
		*numbB |= bitA;
	else
		*numbB &= (~bitA ^ oneShift);

	if (bitB)
		*numbA |= bitB;
	else
		*numbA &= (~bitB ^ oneShift);
}

d'échanger les bits de position bitPosition de numbA et numB mais à cause des if, ce n'est pas ce qu'il y a de mieux et après des appels répétés ( Très répétés ? 5Mm ? ), ça commence à manger du temps d'exécution et puis quand je vois cette ligne:

*numbB &= (~bitA ^ oneShift);

Je me dis qu'il y a mieux

Si vous avez une solution, je suis preneur :)
Merci d'avance


  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2017 à 0:23:36

Bof je dis ça avec un mal de tête: tu peux isoler les bits de chacun de tes nombres et ensuite les échanger avec une variable temporaire comme un échange normal.

Y'a sûrement mieux mais bon !

:-)

EDIT: En trois lignes.

EDIT2: C'est en supposant que tu échanges les bits de même numéro.

-
Edité par moins1 28 juillet 2017 à 0:39:09

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2017 à 1:37:27

Salut,

Tu peux aussi utiliser une addition avec num_a = num_a - bit_a + bit_b et num_b = num_b - bit_b + bit_a.

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
28 juillet 2017 à 2:23:46

Je propose :

void swapBit(unsigned char *pA, unsigned char *pB, int bitPosition)
{
	const unsigned char xorBitAB = (*pA ^ *pB) & (1u << bitPosition);
	*pA ^= xorBitAB;
	*pB ^= xorBitAB;
}

J'ai aussi corrigé le prototype qui contenait un short sans raison.

-
Edité par Marc Mongenet 28 juillet 2017 à 3:19:17

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2017 à 2:36:13

Élégant, concis, simple, que dire de plus. ^^ J’ai pensé au XOR, mais pas comme ça...

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
28 juillet 2017 à 13:50:55

Marc Mongenet a écrit:

Je propose :

void swapBit(unsigned char *pA, unsigned char *pB, int bitPosition)
{
	const unsigned char xorBitAB = (*pA ^ *pB) & (1u << bitPosition);
	*pA ^= xorBitAB;
	*pB ^= xorBitAB;
}

J'ai aussi corrigé le prototype qui contenait un short sans raison.

-
Edité par Marc Mongenet il y a environ 10 heures

Ca m'a l'air parfaitement parfait :)

Merci à vous

  • Partager sur Facebook
  • Partager sur Twitter