Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Algoritmo per la rappresentazione dei numeri binari

    Salve, sto utilizzando un algoritmo che dato un numero lo converte in una stringa di 32 bit binaria.
    Ad esempio il numero 7 viene convertito nella stringa:
    codice:
    00000000000000000000000000000111
    Il segno non viene rappresentato.
    Il primo problema che riscontro è che un unsigned int mi rappresenta al massimo la potenza di 2**30.
    Il mio output su stdin di questo mini programma è:
    codice:
    int main(int argc, char **argv)
    {
        printf("%d",power(2,32));
        printf("%d",power(2,31));
        printf("%d",power(2,30));
        return 0;
    }
    1) 0
    2)-21474836480
    3)10737418240

    Come vedete rappresenta al massimo 2**30, dopodichè presumo esegua il complemento a 2 perchè il numero è troppo grande,anche se uno un unsigned int e se un dovrebbe contenere 2**32 bit cioè 4 byte).
    Vorrei sapere come sopperire a questo problema.

    Per ora siccome non posso rappresentare numeri così grandi ho scritto l' algoritmo usando 16 bit, ecco il secondo problema:
    codice:
    void dec2bin (unsigned int data, short int *bitSeq)
    {
        unsigned int temp=data;
        short int i;
        for(i=15;i>=0;i--)
        {
            if(temp>=power(2,i)
            {
                bitSeq[i]=1;
                temp-=power(2,i);
            }
            else
                bitSeq[i]=0;
        }
    }
    Dove bitSeq è un array di 16 elementi, e data è il numero da convertire.
    L' algoritmo funziona perfettamente, ma ho provato senza risultato a cercare un algoritmo che facesse la stessa identica cosa senza usare la funzione power.
    Come sarebbe possibile cambiare questa funzione senza utilizzare la funzione power? Non conosco altri algoritmi per la conversione in binario.

    Uso mingw32 con code::blocks su windows 7 64 bit.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    premetto che non so risponderti perchè non so il C, ma rimango nell'argomento:

    ieri un mio amico mi ha fatto venire un dubbio. Oggi, con i compilatori moderni, oggi, quando ormai l'ASSEMBLER non esiste più(o quasi), sapere il sistema binario alla perfezione, SERVE A QUALCOSA? io inizialmente ho risposto che più che altro bisogna saper operare con il sistema esadecimale, che può servire, ma onestamente mi è rimasto questo dubbio.
    che mi sapete dire?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    5
    premettendo che sono agli inizi con C, non puoi passare di tipo ?? usare un long int (magari unsigned) o anche un double

  4. #4
    Il problema fondamentale è che, anche se stai usando un unsigned int, stai dicendo a printf di considerarlo come un int con segno (gli passi %d); per risolvere usa %u.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Rising1
    premetto che non so risponderti perchè non so il C, ma rimango nell'argomento:

    ieri un mio amico mi ha fatto venire un dubbio. Oggi, con i compilatori moderni, oggi, quando ormai l'ASSEMBLER non esiste più(o quasi), sapere il sistema binario alla perfezione, SERVE A QUALCOSA? io inizialmente ho risposto che più che altro bisogna saper operare con il sistema esadecimale, che può servire, ma onestamente mi è rimasto questo dubbio.
    che mi sapete dire?
    che l'assembler si usa, eccome (se sei un informatico professionista, e non uno dei tennici "avanti-avanti-avanti") => esadecimale conosciuto come le proprie tasche.

    Che il binario serve eccome, tipicamente per le flag compattate.

    Conviene inoltre saper contar bene anche in ottale (per i diritti *nix).

    ---
    Certo... se ci si occupa di "pigia il bottone del wizard" tutto cambia

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da Rising1
    ieri un mio amico mi ha fatto venire un dubbio...
    Il campo della programmazione non si limita solo al mondo dell'informatica (Unix, Windows, Server, applicazione per ufficio, web etc etc.) ma bensì anche in altri settori, dove per esempio, l'assembler, che essendo un linguaggio che si caratterizza a seconda dell'architettura del dispositivo con cui lavori, devi conoscerlo eccome, altrettanto vale per il sistema esadecimale e binario etc.
    Ovvio che se devi farmi una GUI con N pulsanti etc non programmerai in assembler, ma sicuro che dove metti occhio c'è qualche dispositivo che è stato programmato, appunto, in assembler. Te lo assicuro.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C]Algoritmo per la rappresentazione dei numeri binari

    Originariamente inviato da ramy89
    Come sarebbe possibile cambiare questa funzione senza utilizzare la funzione power? Non conosco altri algoritmi per la conversione in binario.
    Con "power" intendevi "pow"?
    Comunque se hai studiato gli operatori bitwise dovrebbe non risultarti difficile farlo: fai una & ripetuta tra la variabile e 1, shiftando la variabile man mano verso destra di un bit alla volta. In questo modo ottieni la sua rappresentazione binaria "al contrario". Ti basta invertirla e hai finito. E btw, visto che le potenze che fai sono banali potenze intere di 2, non sarebbe così difficile scriverti da solo una funzione che lo faccia senza ricorrere alla più generica pow() che calcola potenze a esponente reale, non necessariamente naturale (basta un semplice ciclo iterativo).

    @Rising1: come ti hanno già detto altri, a meno che tu non voglia fare il programmatore/informatico della domenica, conoscere i sistemi di numerazione a base 2-8-16 è fondamentale, che poi alla fine una volta che hai capito la "simmetria" con il sistema decimale non ci vuole niente a cambiare base.
    In generale ti consiglio di non dare troppo peso al parere della gente comune: fidati solo quando si tratta di persone di provata esperienza, preferibilmente in più settori (non solo nel montare le ventole), e questo non vale solo per l'informatica.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.