View Full Version : [C] type cast
virusso80
25-06-2010, 13:53
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!
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 ? :D
virusso80
27-06-2010, 21:01
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 ? :D
allora provo a spiegarmi bene. Devo implementare l'operazione di modulo bit a bit, nel senso che data una sequenza di bit...arbitrariamente lunga, devo effettuare il modulo rispetto a un intero (eventualmente unsigned)
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
che cos'é l'operazione di modulo bit a bit...? :mbe:
virusso80
27-06-2010, 23:03
che cos'é l'operazione di modulo bit a bit...? :mbe:
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) :(
Deve andare... A parità di stringa e di divisore ti deve sempre ritornare lo stesso modulo.
virusso80
27-06-2010, 23:06
Deve andare... A parità di stringa e di divisore ti deve sempre ritornare lo stesso modulo.
esatto!!!
come faccio eprò a considerare la versione binaria?
come faccio eprò a considerare la versione binaria?
Che vuoi dire ? Quella binaria è solo una rappresentazione del numero, se vuoi la puoi fare anche in ottale, ma il risultato sarà sempre lo stesso.
virusso80
27-06-2010, 23:35
Che vuoi dire ? Quella binaria è solo una rappresentazione del numero, se vuoi la puoi fare anche in ottale, ma il risultato sarà sempre lo stesso.
si ok, mi è chiaro questo. Il mio problema, è come faccio a realizzare l'operazione di modulo tra due campi di tipo diverso (eventualmente anche stringhe con timeval). L'unica cosa in comune è al rappresentazione binaria, che "in fondo" rappresenta un numero e in quanto tale può essere trattato così.
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 :(
Il valore rappresentato dalla rappresentazione binaria è uguale a quello rappresentato dalla rappresentazione decimale, quindi il risultato della divisione è lo stesso.
virusso80
28-06-2010, 09:18
Il valore rappresentato dalla rappresentazione binaria è uguale a quello rappresentato dalla rappresentazione decimale, quindi il risultato della divisione è lo stesso.
grazie per la risposta. mi è perfettamente chiaro. ma data un generico dato dd, come faccio a fare
dd % 3?
per questo il problema del cast...originario.
Dipende su quanti byte di dd vuoi fare tale operazione... dd è 1, 2, 4, 8 byte ?
virusso80
28-06-2010, 13:23
Dipende su quanti byte di dd vuoi fare tale operazione... dd è 1, 2, 4, 8 byte ?
diciamo che la lunghezza in byte è nota, cioè è un parametro della funzione. il divisore è sempre 1 byte
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. non ho capito perché la chiami "bit a bit": le operazioni bitwise sono un'altra cosa, sono diverse dalle operazioni logiche.
virusso80
28-06-2010, 13:54
non ho capito perché la chiami "bit a bit": le operazioni bitwise sono un'altra cosa, sono diverse dalle operazioni logiche.
ok forse ho usato una espressione impropria. Intendevo che credo bisogni considerare le operazioni bit a bit (come shift & e |) per realizzare l'operazione di mod.
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
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.
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
virusso80
28-06-2010, 16:03
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.
grazie per la risposta. Ci sono, ma se le cifre significative del divisore sono inferiori alla lunghezza del byte (es il divisore è 5 cioè 101) come ragiono...? non posso ragionare byte a byte
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
non posso ragionare byte a byte
Certo e funziona allo stesso modo...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.