Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/02/2015, à 07:10

temps

[résolu] Tri en C++

Bonjour,
J'ai un tableau de 8 valeurs que je dois additionner ou soustraire, la sélection se fait à l'aide d'un octet.

J’envisage la solution d'un switch de 256 cas mais je pense qu'il doit y avoir une manière plus légère pour effectuer ce tri.

switch (octetdetri) {

case 0 :
 a = x + valeur[0];
 b = x + valeur[1];
...

 break;

case 1 :
 a = x - valeur[0];
 b = x + valeur[1];
...

 break;
....
...
case 255 :
 a = x - valeur[0];
 b = x - valeur[1];
...

 break;
}

Cordialement

Dernière modification par temps (Le 18/02/2015, à 15:54)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 18/02/2015, à 07:23

temps

Re : [résolu] Tri en C++

bonjour,
en écrivant le poste je pensais en exemple à l’opérateur modulo 2

octetdetri % 2

Faire un modulo de la valeur selon la réponse la première valeur est dans telle position
Diviser par deux puis refaire un modulo pour avoir la position de la deuxième valeur
... répéter pour les 8 cas

Cordialement

Dernière modification par temps (Le 18/02/2015, à 07:25)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#3 Le 18/02/2015, à 08:11

pingouinux

Re : [résolu] Tri en C++

Bonjour,
Le bit n° n (à partir de la droite, en commençant à 0) est positionné si

octetdetri & (1<<n) != 0

Ajouté :
Si tu veux que le résultat soit 0 ou 1

(octetdetri >> n) & 1

Dernière modification par pingouinux (Le 18/02/2015, à 08:17)

Hors ligne

#4 Le 18/02/2015, à 08:31

temps

Re : [résolu] Tri en C++

Bonjour,
Merci pour la réponse.
j'en étais encore à la structure conditionnelle

a = ((octetdetri %2==0 == 1) ? x+valeur[0] : x-valeur[0]);

Le concept de lire les bit dans l'octet est bien meilleur, même si au premier regard j'imagine qu'il manque une boucle de for dans le code donné.
Il va falloir que que j'apprenne car je veux savoir la position, le code donné permet de la créer non pas de la lire (je crois à vérifier).

Donc j'imagine le code commence par

  for(int n = 8; n>0; n--)
   {
ou est n ?
a[n] = ((positionbitn==0 == 1) ? x+valeur[n] : x-valeur[n]);
}
  

Cordialement

Dernière modification par temps (Le 18/02/2015, à 08:51)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#5 Le 18/02/2015, à 09:32

ssdg

Re : [résolu] Tri en C++

Il y a l'option de faire un & aussi (je ne me souvient plus de l'opérateur), mais pour l'exemple disons que c'est "&" et qu'il existe un opérateur "^" pour puissance (je crois qu'en C c'est une fonction)

  for(int n = 0; n<8; n++)
   {
a[n] = ((x & 2^n) ? x+valeur[n] : x-valeur[n]);
}


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#6 Le 18/02/2015, à 09:59

pingouinux

Re : [résolu] Tri en C++

ssdg a écrit :

et qu'il existe un opérateur "^" pour puissance

^ est l'opérateur ou exclusif.

Hors ligne

#7 Le 18/02/2015, à 10:10

ssdg

Re : [résolu] Tri en C++

Du coup, tu peux sans doute donner le nom de la fonction qui me manque?


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#8 Le 18/02/2015, à 10:17

pingouinux

Re : [résolu] Tri en C++

& est l'opérateur ET
L'équivalent de ce que tu voulais faire est

x & (1<<n)

mais je n'ai pas compris ce que temps cherche à faire exactement.

Hors ligne

#9 Le 18/02/2015, à 12:32

ssdg

Re : [résolu] Tri en C++

En fait, il a un octet (donc 8 booléens), un tableau de 8 valeurs et un nombre.

Il veut obtenir un second tableau de 8 valeurs à en dériver.

Pour chaque "position", il faut valeur d'origine + valeur du tableau ou  valeur d'origine - valeur du tableau en fonction du booleen correspondant dans l'octet.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#10 Le 18/02/2015, à 14:01

pingouinux

Re : [résolu] Tri en C++

Dans ce cas, ce serait :

a[n] = ( (octetdetri >> n) & 1 ? x-valeur[n] : x+valeur[n] );

ou bien

a[n] = x + (1-2*((octetdetri >> n) & 1)) * valeur[n];

x ne dépend-il pas de n ?

Hors ligne

#11 Le 18/02/2015, à 15:53

temps

Re : [résolu] Tri en C++

Merci pour les réponses,
je poste en résolu.

pour le détail, x ne dépend pas de n.
En fait x est une valeur flottante qui dépend d'autres facteurs, mais l'effet obtenu est ce qui va se produire autour de x. L'objectif est de piloter l’emplacement des 8 octets à l'aide d'un seul octet. Les cas possibles des 8 octets se trouvant dans une structure.
En moins compliqué peut-être, le but est de faire varier une structure prédéfinie de cas possibles autour d'une valeur fixe en utilisant qu'un seul octet tout les 8 octets de la structure.

Cordialement

Dernière modification par temps (Le 18/02/2015, à 15:56)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne