|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
Quindi tu mi dici che leggendo un pezzo di stdin in una funzione e l'altro nella funzione chiamata è corretto dal punto di vista concettuale? A me potrebbe non fregarmene di meno, però ai professori di algoritmi penso di sì ![]() Inoltre sai come potrei recuperare il bit scartato da uno shift? Il problema mi sorge perché quando acquisisco le stringhe binarie da stdin queste si trovano nell'ordine MSB->LSB. Sommandone due però poi nella struttura ho la cifra in ordine LSB->MSB e quindi sorgono problemi quando devo sommarne una terza. O creo un'altra struttura in cui metto ricreo l'ordine MSB-LSB o faccio in modo di estrarre i bit da sinistra e non da destra (appunto ma come faccio?) Scusa se stresso, ma non ho mai usato il C con gli operatori bitwise ![]() |
|
![]() |
![]() |
![]() |
#22 | |||
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Fare una lista di interi non ha senso... E' solo un spreco... Quote:
Quote:
|
|||
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma leggi sempre 8 bit alla volta ?
|
![]() |
![]() |
![]() |
#24 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
![]() Ovviamente il primo bit che mi troverei ad estrarre per l'operazione di addizione sarebbe LSB: nel risultato però l'ordine dei bit si capovolgerebbe. Potrei estrarre i bit da sinistra usando una maschera di bit e facendone l'and con il risultato, però quanto deve essere lunga questa maschera? 32 bit? L'unsigned int è sempre di 4 byte in ogni sistema secondo lo standard ANSI? |
|
![]() |
![]() |
![]() |
#25 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
|
|
![]() |
![]() |
![]() |
#26 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Ho messo un vettore di 32 interi...ma non per contenere tutti i possibili valori immessi... Codice:
struct bits { unsigned int data[BYTELEN]; int pos; /*indica il primo libero*/ struct bits *next; }; Allora, se vuoi usare la struttura come uno stack è comuqnue facile... Comunque mi hai detto tu che dovevi leggere taaanti bit... E questa è la struttura migliore per leggerne tanti (non allocare ogni volta un solo int, che sarebbe uno spreco di spazio, per 32 bit allochi anche 32 bit di puntatore)... Magari per un programma scolastico può anche andare bene... Comunque nel mio prog se metti BYTELEN a 1 ottieni praticamente lo stesso risultato ![]() Gli interi sono a 32 bit su tutti i sistemi a 32 bit (il codice che ho scritto con un piccolo cambiamento può funzionare con qualsiasi dimensione degli interi)...ed anche tu dovresti farlo in grado di funzionare con qualsiasi dimensione degli interi... Con piccoli cambiamenti si può adattare alla tua situazione... Codice:
#define BYTELEN 32 #define LEN BYTELEN*sizeof(int) struct bits { unsigned int data[BYTELEN]; int pos; /*indica il primo libero*/ struct bits *next; }; /* se vuoi una struttura come stack */ struct bits *alloca_stack(struct bits *next) { struct bits *nuovo; int i; nuovo = (struct bits *)malloc(sizeof(struct bits *)); /* le strutture esistenti vengono messe in coda */ nuovo->next = next; nuovo->pos = 0; for(i = 0; i < BYTELEN; ++i) nuovo->data[i] = 0; return nuovo; } int inserisci_bit(struct bits **data, char cbit) { unsiegned int op; if(!(cbit == '0' || cbit == '1')) return -1; if((*data)->pos == LEN) /* è pieno */ (*data) = alloca_stack(*data); /* il bit viene inserito a partire dal LSB dell'int */ op = 1 << ((*data)->pos)%(sizeof(int)*8); if(cbit == '1') ((*data)->data[((*data)->pos)/(sizeof(int)*8)] |= op; else /*inserimento dello 0*/ ((*data)->data[((*data)->pos)/(sizeof(int)*8)] &= ~op; return 0; } int inserisci(struct bits **data, char *sbits) { if(!sbits || !*data) return -1; while(strlen(sbits) > 0) { if(inserisci_bit(data, *sbits)) return -1; ++sbits; } return 0; } int leggi_input(FILE *in = stdin) { struct bits *data; data = alloca_stack(NULL); /*ora leggi da "in" l'input, quando hai trovato il comando e la stringa di bit semplicemente richiami: */ inserisci(data, stringa_bits); } Ultima modifica di cionci : 12-02-2004 alle 08:23. |
|
![]() |
![]() |
![]() |
#27 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Altrimenti quando hai una intera lista di interi quando fai uno shift devi farlo su tutti e devi recuperare l'ultimo bit che esce e metterlo nella struttura successiva (un macello)... |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:18.