IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Conversion decimal binaire d'un nombre signé


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut Conversion decimal binaire d'un nombre signé
    Bonjour.
    Je recherche une fonction sous Matlab permetant de convertir un nombre decimal signe en nombre binaire et inversement.

    Je connais deja les fonctions:
    de2bi <-> bi2de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    de2bi(5,4)            de2bi(-5,4)  
        = [1 0 1 0]          = error
    dec2bin <-> bin2dec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dec2bin(5,4)        dec2bin(-5,4)
        = 0101               = /0//
    Mais de2bi ne gere pas les entiers negatifs, et dec2bin me donne un truc bizzard.
    j'ai besoin d'un fomat binaire du type tableau [1 1 0 1 0 1] pour pouvoir faire des masquages du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = [1 0 0 0 0 0] | ( [1 1 1 1 0 0] & [1 1 0 1 0 1] );
    Je suis ouvert a toute solution

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Je ne pense pas que ça existe (ceci dit je n'ai pas les fonctions de2bi et bi2de sur ma version) mais ça ne doit pas être très compliqué à coder toi-même si tu sais le faire "à la main".
    En plus la fonction dec2bin est éditable donc tu peux t'en inspirer.
    :arrow: Règles du Forum

    Adepte de la maïeutique

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut
    Merci pour ta reponse
    Bon, et bien editon.

    Je vais voir si il n'y a pas une astuce du genre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    -> temp = de2bi(abs(-5),6)               % convertion
    -> temp2 = xor( [1 1 1 1 1 1] , temp) % complement a 1
    -> result = ?????????????              % complement a 2
    Mais ca risque de ne pas etre optimise.
    Deja que ma simulation me prend la nuit.
    cette fonction est critique,Je vais essayer de l'optimiser

    PS:J'ai la version Matlab 7.3.0 (R2006b).

  4. #4
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par ---okaido--- Voir le message
    Je vais essayer de l'optimiser
    Une des possibilités est justement, si on est TRES sur de soi et de son programme de reprendre les fonctions de MATLAB en enlevant tous les tests d'erreur qui malgré tout prenne du temps.
    Or si toi tu es sur que le format qui va rentrer dans la fonction est le bon tu n'as pas besoin de ces tests.
    Par exemple dans dec2bin on pourrait commenter ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    % if nargin<1
    %     error(nargchk(1,2,nargin,'struct'));
    % end
    % if isempty(d)
    %     s = '';
    %     return;
    % end
     
    d = d(:); % Make sure d is a column vector.
    % if ~(isnumeric(d) || islogical(d) || ischar(d))
    %     error('MATLAB:dec2bin:InvalidDecimalArg','D must be numeric.');
    % end
    d = double(d);
     
    if nargin<2
        n=1; % Need at least one digit even for 0.
    else
    %     if ~(isnumeric(n) || ischar(n)) || ~isscalar(n) || n<0
    %         error('MATLAB:dec2bin:InvalidBitArg','N must be a positive scalar numeric.');
    %     end
        n = double(n);
        n = round(n); % Make sure n is an integer.
    end;
     
    %
    % Actual algorithm
    %
    [f,e]=log2(max(d)); %#ok How many digits do we need to represent the numbers?
    s=char(rem(floor(d*pow2(1-max(n,e):0)),2)+'0');
    Attention par contre à enregistrer dans ta propre fonction et non pas dans les sources de MATLAB au risque de rencontrer des problèmes plus tard.

    Sinon pour l'optimisation je t'encourage aussi vivement à utiliser la fonctionnalité PROFILER de MATLAB si tu ne l'as déjà fait.
    :arrow: Règles du Forum

    Adepte de la maïeutique

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    Voici un exemple de bin --> dec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function N = binvfdec(m,e)
    n=length(m);
    N=-str2num(m(1))*2^(n-e-1);r=1;
    for i = n-e-2:-1:-e
    r=r+1;
    N=N+str2num(m(r))*2^(i);
    end
    exemple :
    e : est l'échelle c-a-d le nombre de bits après la virgule.
    binvfdec('11100000',6)

    ans = -0.5000

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Il n'est pas nécessaire d'utiliser STR2NUM pour convertir des valeurs binaires sous forme de chaines de caractères vers des valeurs numériques.

    Voir la : Comment transformer un signal sous forme de chaine de caractères en valeurs numériques

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function N = binvfdec(m,e)
    n=length(m);
    N=-(m(1)-48)*2^(n-e-1);r=1;
    for i = n-e-2:-1:-e
    r=r+1;
    N=N+(m(r)-48)*2^(i);
    end
    Ou de façon plus compacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function N = binvfdec(m,e)
    n=length(m);
    N = sum([-(m(1)-48)*2^(n-e-1) (m(2:end)-48).*2.^(n-e-2:-1:-e)]);
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function N = binvfdec(m,e)
    n=length(m);
    N = (m-48).*2.^([n-e-1 n-e-2:-1:-e]);
    N(1) = -N(1);
    N = sum(N);

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut
    J'ai reussi.

    Merci a Caro-Line, phryte et Dut. Je me suis inspire de vos code.
    J'ai fait saute tous les IF, FOR, WHILE, ect...

    pour la convertion dec -> bin: non signe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = 5; % Inpout positive integer 
    n = 4; % Number of bits in outpout
    result = rem(floor(d*pow2(1-n:0)),2);
        result = [ 0 1 0 1]
    pour la convertion dec -> bin: signe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = -5; % Inpout positive or negative integer
    n = 4; % Number of bits in outpout
    result = abs(rem(floor(d*pow2(1-n:0)),2));
        result = [ 1 0 1 1]
    pour la convertion bin -> dec: non signe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    b=[1 0 1 1]; % binarie inpout not signed
    n=4; % Number of bits in inpout
    result = sum(b .* pow2(n-1:-1:0),2);
        result = 11
    pour la convertion bin -> dec: signe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    b=[1 0 1 1]; % binarie inpout signed
    n=4; % Number of bits in inpout
    result = sum([-(b(1))*2^(n-1) b(2:4).*2.^(n-2:-1:0)]);
        result = -5
    Aucune convertion vers les carateres et utilisation exclusif de fonctions dites RAPIDE car proche du materiel, Merci a tous

    PS: je valide en fin de journee. Mais avant, quelqu'un a un truc a ajoute?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion decimal > binaire
    Par chrozak dans le forum Android
    Réponses: 2
    Dernier message: 24/09/2014, 22h34
  2. Conversion Decimal-Binaire
    Par _A.T.Omix_ dans le forum C++
    Réponses: 1
    Dernier message: 17/12/2008, 18h09
  3. Conversion decimal binaire
    Par yohan.fay dans le forum Delphi
    Réponses: 5
    Dernier message: 28/06/2006, 22h20
  4. [Binaire] Conversion decimal -> binaire sans vecteur
    Par yann1979 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 17h10
  5. CRITERIA - Représentation binaire d'un nombre décimal signé.
    Par RamDevTeam dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 10/08/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo