Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ruby
Ruby Le forum sur la programmation Ruby. Voir aussi la FAQ Ruby et les cours Ruby.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 18h08   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 11
Points : 2
Points : 2
Par défaut surcharge d'opérateurs du type "var[31:0]"

Bonsoir,

Excusez moi si je reposte ce message, j'ai l'impression qu'il n'est pas passé car je ne le vois pas dans la liste.

Je voudrais savoir comment surcharger les opérateurs pour pouvoir accéder à certains bits d'un entier.
Par exemple :
var[31:16] correspondrait au 16 bits de poids fort de mon entier var
var[15:8] correspondrait au 2ème octet de mon entier var

Merci

Frédéric
frederic_dumoulin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 12h37   #2
Membre habitué
 
Inscription : décembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 123
Points : 144
Points : 144
Il est possible de modifier l'opérateur existant pour la classe Fixnum, mais c'est plutôt casse-gueule. Il faut redéfinir l'opérateur existant qui permet de récupérer un bit pour prendre en compte la class Range (tu n'écriras pas X:Y mais X..Y).
Je te déconseille fortement ce genre de manip à moins d'être vraiment sûr de ton coup:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
> 3[0]
 => 1
>
> class Fixnum
>   def [] arg
>      p "Oh!, j'ai cassé l'opérateur!"
>   end
> end
>
> 3[0]
"Oh!, j'ai cassé l'opérateur!"
 => "Oh!, j'ai cassé l'opérateur!"
Il vaut mieux utiliser un bon vieux masque/décalage pour récupérer la valeur que tu cherches. Pour les 16 bits de poids fort par exemple:
Code :
1
2
 
(x & 0xFFFF0000) >> 16
Sinon tu peux jeter un oeil du côté de la gem bit-struct si tu veux jouer avec des bitfields.
jc-miranda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 14h33   #3
Invité de passage
 
Inscription : octobre 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 11
Points : 2
Points : 2
Bonjour,

Merci pour ta réponse.
En fait je voudrais éviter à l'utilisateur d'avoir à calculer les masques et décalages, c'est pour ça que je pensais utiliser les [ ].

La manip que tu as faite correspond exactement à ce que je cherche:-)
Comment je peux récupérer les indices X et Y dans la fonction de surcharge ?


Fred
frederic_dumoulin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 09h13   #4
Membre habitué
 
Inscription : décembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 123
Points : 144
Points : 144
Comme je ne suis pas fan de changer l'opérateur [] car il faudrait maintenir le fonctionnement actuel en plus du nouveau en croisant les doigts pour ne rien casser, voilà une fonction à l'arrache.

Elle doit faire ce que vous voulez, mais attention, sans aucun check des ranges de bits demandés et sans considérer les dérapages possibles liés au changement de type en cas d'âneries.

Code :
1
2
3
4
5
6
7
8
9
10
11
 
class Fixnum
  def my_bitfield range
    raise ArgumentError unless Range == range.class
    mask = 2**(range.last+1) - 2**range.first
    (self & mask) >> range.first
  end
end
 
> 0x8000F134.my_bitfield 16..31
 => 32768
jc-miranda est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h16.


 
 
 
 
Partenaires

Hébergement Web