|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
[C] type cast
Ciao a tutti,
ho necessità di considerare dei campi di un record (che possono essere interi, stringhe, char, strutture complesse) nel loro formato binario (non mi interessa visualizzarlo) originario: es. char s[] = "ciao" mi serve "considerarlo" come se fosse un binario per effettuare su di lui operazioni di modulo (%) sui bit per poi ottenere un unsigned come risultato se facessi così: unsigned u = (unsigned) s; unsigned res = s % u; In questi casi, effettuare un semplice cast a unsigned non va bene...giusto? io infatti vorrei che ogni volta che ho quella stringa (o in generale quel dato) ottengo sempre lo stesso risultato da questa operazione di %, e così non è. Credo mi sto perdendo qualcosa come posso fare? mi date una dritta! grazie e scusate anticipatamente per la domanda stupida! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non va bene quel cast, perché fai il cast del puntatore al primo elemento della stringa ad unsigned int.
Devi usare il puntatore: unsigned int x = *(unsgned int *)s; Devi fare una hash map ? |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
Quote:
nel post precedente il mio scopo era quello di convertire tutto a unsigned int e poi usare il % built-in...ma non va! Credo che bisogna cambiare completamente approccio e ragionare "bitwise". è solo che non mi è ben chiaro come procedere. Volevo giusto qualche dritta Grazie anticipatamente Ultima modifica di virusso80 : 27-06-2010 alle 22:24. |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
semplicmeente l'operazione che si fa con %
es. 6 % 3 = 0, 5 % 2 = 1 etc, praticamente la funzione che calcola il resto della divisione fra due numeri, la dovrei fare considerando il numero (byte) relativo a quella sequenza di bit. es: char s [] = "ciao" in binario supponiamo si rappresenti con 10010101101...1010 io voglio claoclare il modulo del relativo numero rispetto a un parametro che ho io es 3 quindi voglio fare 10010101101...1010 % 101 non so se mi sono spiegato. Non riesco a capire come ragionare per prendere la versione binaria del parametro (ovviamnte la considererei a gruppi di byte) |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Deve andare... A parità di stringa e di divisore ti deve sempre ritornare lo stesso modulo.
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
Quote:
Come faccio eprò a ragionare sui bit della stringa o della struttura complessa? in poche parole, faccio delle azioni in base al risultato del mod su una generica coppia di campi, che non avendo nulla in comune, credo possono essere presi nella loro rappresentazione base. Per questo avevo l'idea di concentrarmi sulla loro rappresentazione binaria. Ma non riesco a capire bene Ultima modifica di virusso80 : 27-06-2010 alle 23:39. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il valore rappresentato dalla rappresentazione binaria è uguale a quello rappresentato dalla rappresentazione decimale, quindi il risultato della divisione è lo stesso.
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
Quote:
dd % 3? per questo il problema del cast...originario. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dipende su quanti byte di dd vuoi fare tale operazione... dd è 1, 2, 4, 8 byte ?
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
non ho capito perché la chiami "bit a bit": le operazioni bitwise sono un'altra cosa, sono diverse dalle operazioni logiche.
|
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
Quote:
Mi scuso per il cattivo uso dell'espressione. Credo cmq che il problema sia chiaro. mi ripeto cercando di essere maggiormente chiaro: devo cercare di realizzare un metodo unsigned calcolaMod (void* input, unsigned len, unsigned divisore) e ritorni il resto dell'operazione. In questo caso input è un puntatore a void, in modo da applicare questo metodo a qualsiasi tipo di dato. spero di essere stato utile... il mio problema è che devo riuscire a considerare la rappresentazione binaria (o altro formato numerico) del dato, perchè mi serve il resto nella divisione, e questo deve essere indipendente dal tipo di dato, nel senso che deve funzioanre sia che gli passo interi sia che gli passo stringhe. Unico modo che mi viene in mente è quello che farei anche manualemnte e cioè faccio divisione (eventualmente modulo 2 per non tenere conto dei riporti ed è più veloce da implementare) e poi mi devo abbassare la cifra di volta in volta... quindi es. char * s = "re" supponiamo che sia rappresentato in binario come 10100011 11001100 (ovvero 2 byte) divisore = 11001011 (già in binario) mi trovo a fare la prima volta 10100011 XOR 11001011 = 01101000 quindi devo "abbassare" il primo 1 del secondo byte ma per fare questo devo - shiftare a sinistra il resto parziale (così tolgo la cifra 0 iniziale) e quindi - fare OR con il secondo byte (in cui l'unica cifra che mi interessa è stata shiftata nella posizione meno significativa) - ripetere di nuovo per tutti i bit rimanenti del secondo byte nn so se è chiaro come approccio. Mi chiedevo se ci fosse un modo rapido o se è sbagliato questo modo di procedere Grazie anticipatamente Ultima modifica di virusso80 : 28-06-2010 alle 14:04. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quindi una lunghezza generica ? In tal caso è semplice
Come fai una divisione su carta ? Allo stesso modo puoi fare una divisione byte a byte ed ovviamente ottenere il resto finale. Invece di usare le cifre decimali, selezioni come cifra un byte. Nel caso ci sia resto dal passo precedente lo metti nel secondo byte meno significativo dell'intero e fai l'operazione in questo modo. Ultima modifica di cionci : 28-06-2010 alle 14:54. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un esempio semplice:
AA CC DE 1A / FF AA / FF = 00 resto AA AA CC / FF = AB resto 77 77 DE / FF = 78 resto 56 56 1A / FF = 56 resto 70 |
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Oct 2005
Città: Milano
Messaggi: 153
|
Quote:
es. 10100011 11001100 / 101 101????? -------- 000????? per "abbassare" le cifre successive diventa davvero macchinoso visto che vanno "abbassate" una alla volta...ma credo non ci sia un modo più rapido vero? non c'è un modo per far fare il più possibile a C piuttosto che implementare tutto? Grazie mille per la disponibilità e la gentilezza Ultima modifica di virusso80 : 28-06-2010 alle 16:14. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:55.




















