Ha veramente bisogno di convertire decimale, stringa, ecc in binario?

0

Sono molto nuovo alla programmazione. Basta leggere alcuni articoli sull'algoritmo per convertire un decimale o una stringa in binario. Ma, secondo quello che so, i computer conservano questi dati in forma binaria. Quindi, perché non leggiamo semplicemente binario crudo nella memoria? Non è molto più facile e veloce? Se possibile, come farlo in C o Assembly?

Ho solo bisogno della forma binaria del numero di input, ad esempio: controlla se un numero positivo è una potenza di due o meno. La mia idea è: se N = 2 ^ k (N e k sono interi positivi) allora la forma binaria di N è 100 ... 0 (k volte di 0).

    
posta anhvh 24.04.2015 - 10:13
fonte

3 risposte

1

Lavoriamo con le rappresentazioni binarie di numeri internamente, ma alla fine persone vogliamo usare un programma per computer, e lì il formato non è utilizzabile. Quindi abbiamo bisogno di avere il codice per convertire le rappresentazioni di stringa di cose in binario, ma solo per nuovi dati inseriti dall'utente .

Le persone sono estremamente cattive nel ricordare le rappresentazioni densi di informazioni - è per questo che abbiamo inventato l'alfabeto in primo luogo. Quindi, se l'utente inserisce un prezzo o un'età, entrano nel programma come una sequenza di caratteri. Per fare qualsiasi aritmetica su di essi, il computer deve convertirli in numeri, che su praticamente tutti i computer digitali significa creare il pattern di bit corrispondente a quel numero.

Molto più spesso sorge il problema inverso: il programma ha memorizzato un valore come un numero, ma l'utente vorrebbe vedere la sequenza di cifre leggibile. Ciò significa che il computer deve formattare il numero nella sintassi di input (o ricordare la rappresentazione originale).

È vero che l'intero business del software sarebbe diventato più facile se le persone imparassero a capire le rappresentazioni binarie, ma questo non è nelle carte finché non inventeremo alcuni imbrogli neuroprogrammatici gravi , quindi per il momento essendo noi siamo bloccati con la conversione dei numeri avanti e indietro tutto il tempo.

    
risposta data 24.04.2015 - 10:23
fonte
1

Sì, è vero. Sia le stringhe che i decimali, così come tutti gli altri tipi, sono rappresentati in binario.

Tuttavia, il problema sta nel significato del binario. Non puoi semplicemente leggere una stringa come decimale, o almeno non dovresti farlo se stai cercando di ottenere la rappresentazione decimale di quel decimale.

Prendi ad esempio questa stringa in ASCII: "1.5"

In binario, questo è rappresentato da una matrice di byte di dimensione 4 o superiore.

1  .  5  
4.07659398311e-315
31 2E 35 00

Se questo dovesse essere interpretato come un doppio, il valore sarebbe:

1  .  5  
4.07659398311e-315
31 2E 35 00

Che cosa ha a che fare con il numero 1.5? Condividono lo stesso messaggio binario, ma poiché il binario è valido solo come la sua interpretazione, questo doppio non ha senso. Questa interpretazione è ulteriormente complicata se si considera che alcuni sistemi preferiscono salvare le informazioni decimali nei formati big-endian o little-endian, il che significa che si dipende anche dal sistema su cui si sta lavorando.

Per convertire questo in un double, dovresti analizzare questo file binario come previsto. Come risulta, la conversione equivalente di 1,5 in esadecimale è 0x3FF8000000000000.

Se si preferisce la precisione, in genere si tende a mantenere solo la forma della stringa nel programma. Allo stesso modo, se è necessario utilizzare questo valore nei calcoli, si mantiene il float o il double form. Quindi cosa succede se hai bisogno di entrambi? Tieni entrambi nel tuo programma, usando la forma più adatta per precisione o calcolo. Molto tempo fa sono i giorni in cui tenere entrambi in memoria potrebbe essere un problema (salvo alcune eccezioni in cui la velocità è critica, come nel caso dei driver).

Se si desidera determinare se una rappresentazione di stringa di un numero è una potenza di 2, il calcolo per farlo sarebbe più complicato del semplice atto di convertirlo prima in un numero. Una volta che è un numero, determinare se sia o meno una potenza di due è banale, con qualsiasi stringa binaria che contenga esattamente 1 (nel caso di decimale, dovresti controllare anche per le stringhe binarie che contengono esattamente uno 0 per i valori decimali negativi) .

    
risposta data 24.04.2015 - 10:31
fonte
0

Risponderò alla tua domanda.

So why don't we just read raw binary in the memory?

Ma stiamo leggendo i calcoli binari grezzi, il netowrking, è tutta la rappresentazione basata su binarie. Farò un ulteriore passo avanti e dirò che i computer in ultima analisi usano solo la rappresentazione binaria.

Isn't it much easier and faster? If possible, how to do that in C or Assembly?

Consideriamolo.

Supponiamo che abbiamo una tastiera a due pulsanti con 0 e 1, come sarà il codice per la lettura? (pseudocodice, avviso!):

function readNumber() {
  int number;
  while(someStopCondition()) {
    number = (number << 1) | readClick()
  }
  return number;
}

È un'idea corretta cosa vuoi ottenere? Devi considerare più tipi di numeri, come anche i decimali. Come utente inserirà un 2.1?

01000000000001100110011001100110

Sì, questo è 2.1. Il punto è che i computer sono per gli umani, quindi dovrebbero risolvere i problemi per noi senza renderli più complessi .

    
risposta data 24.04.2015 - 11:18
fonte

Leggi altre domande sui tag