Conversione carattere in numero binario

di il
6 risposte

Conversione carattere in numero binario

Ciao a tutti!
allora, vorrei sapere se c'è un modo più semplice di quello in seguito per calcolare il numero binario di un carattere, per esempio "a" corrsiponde a "01100001" ecco qua:

#include <stdio.h>
int main()
{
unsigned int i,bin[8];
unsigned char letter;

  printf("Immettere una lettera: ");
  scanf("%c", &letter);
  getchar();

// DA QUI
{
  for(i=0;i<8;i++) {
  bin[i]=((letter>>i)&1);
}
  for(i=0;i<8;i++) {
  printf("%d",bin[7-i]);
}
// A QUI 

  printf("\n");
return 0;
}
}
ho letto anche che su può calcolare il tutto convertendo prima la lettera in un numero esadecimale e poi dividendo il tutto per 2. se il resto, non il risulatato, della divisione è pari a zero la prima cifra del numero binario è 0, credo. come si può realizzare?
comunque, non capisco il funzionamento della parte che riguarda la conversione (vedi sopra "DA QUI .... A QUI") nel blocco code. se non mi sbaglio è un bit-shift ? grazie per qualche risposta!
ciao

6 Risposte

  • Re: Conversione carattere in numero binario

    Ciao.. Allora l'operazione di estrazione dei bit mi ha accompagnato per un bel pò durante il corso di Programmazione II.. E' davvero molto semplice l'operazione che effettua il tuo codice..

    Un char è formato da 8 bit per questo il for è for(i=0;i<8;i++) così.

    Allora in questo for

    for(i=0;i<8;i++) {
    bin=((letter>>i)&1);
    }

    si fa una cosa molto semplice.. hai 8 bit per esempio "01010101" e devi inserirli nell'array per poi visualizzarli, allora effettui una AND ad 1.

    quindi "01010101" & "00000001" -> la AND da 1 se e solo se entrambi i bit da confrontare sono 1 quindi in questo caso avremo come risultato la stringa "00000001", in pratica si va a salvare l'ultimo bit della stringa del char nella i-esima casella dell'array. lo shift serve a scalare i bit cosi da effettuare la stessa operazione su tutti e 8 bit perchè effettuando lo shift al secondo passaggio avrai "00101010" e così effettuerai la stessa operazione.

    Alla fine il tuo array conterrà tutti i bit della variabile char però inseriti al contrario.. infatti partendo da 0 tu salvi l'ultimo bit della variabile char nella prima casella dell'array e cosi via..

    è per questo motivo che il for di lettura va al contrario ossia

    for(i=0;i<8;i++) {
    printf("%d",bin[7-i]);

    in questo caso potevi scrivere anche


    for(i=7;i>=0;i--) {
    printf("%d",bin);

    in questo modo il codice è più leggibile..

    esercitati molto su queste cose altrimenti risulteranno essere sempre difficili
  • Re: Conversione carattere in numero binario

    Ciao! Grazie per la tua risposta. allora vediamo se ho capito bene il funzionamento:
    nel primo for vengono spostati i bit verso destra e confrontati sempre col &1 e salvati al contrario.
    nel secondo for vengono rimessi in ordine partendo dall'ultimo che viene messo come primo a sinistra.
    comunque la conversione da carattere in numero binario avviene nel primo for.

    il tutto lo devo fare per due lettere perchè devo usare il bitoperator XOR per confrontare i due numeri binari e visualizzare le differenze sia in numero binario che in un numero "normale". Esempio:
    confrontare i numeri binari delle lettere a e b.
    a = 01100001
    b = 01100010
    differenza = 00000011
    differenze totali: 2 (1 e 1)

    per realizzare questa cosa come devo procedere?
    devo confrontare bin1[8] della prima lettera con bin2[8] della seconda lettera ?
    grazie, ciao
  • Re: Conversione carattere in numero binario

    Potresti estrarre i bit della prima lettera in un array e i bit della seconda lettera in un altro array e poi vedere le differenze con un semplice for ma non servirebbe a niente perchè tu devi lavorare solo ed escludivamente con gli operatori bitwise..

    quindi devi fare semplicemente cosi..

    char x,y,z;
    x='a';
    y='b';
    z=x^y;
    //da qui effettui l'estrazione dei bit come hai fatto precedentemente sulla variabile z..

    è molto semplice.. quello che hai scritto tu è riportato in questo modo in linguaggio C.. in questo modo infatti effettui una Xor tra i due caratteri a e b e il risultato lo inserisci nella variabile z.

    a questo punto effettui un for per vedere quanti 1 ci sono nell'array dei bit corrispondenti alla variabile z e quello sarà il numero di bit differenti
  • Re: Conversione carattere in numero binario

    (a = 01100001) ^ (b = 01100010) = (c = 00000011)

    quando usi gli operatori bitwise operi sui bit delle variabili.. quindi c=x^y

    estraendo i bit della variabile c avrai la stringa di bit 00000011 e quindi puoi contare le defferenze (ossia il numero di 1)

    spero di essere stato piu chiaro xD
  • Re: Conversione carattere in numero binario

    Ciao!
    si, grazie per i chiarimenti...vedremo domani come andrà quando spiegherò al mio tutor il source code!! grazie di nuovo!
    ciao
  • Re: Conversione carattere in numero binario

    Scusate, perché nella dichiarazione:
    unsigned int i, bin[8];
    unsigned char letter;
    .. viene utilizzato unsigned?

    Il getchar() so che serve a leggere ogni singolo carattere. Ma perché nelle parentesi non c'è niente? Cioè il getchar() viene direttamente associato alla variabile "letter"? Mi spieghereste un po' come funziona.. Grazie!
Devi accedere o registrarti per scrivere nel forum
6 risposte