è possibile simulare le operazioni aritmetiche su interi usando le operazioni bit a bit?
è possibile simulare le operazioni aritmetiche su interi usando le operazioni bit a bit?
ehm scusate ho dimenticato il linguaggio...si tratta di c++
Non ho ben capito cosa vuoi dire...
Vuoi fare delle operazioni su dei numeri, pero' invece che usare il +, il -, il *, il / etc vuoi usare gli operatori bit a bit?
Se volevi dire questo, si' e' possibile... Il compilatore infatti traduce le operazioni +, - etc in operazioni bit a bit...
Come si fa pero' non so... Devi lavorarci un po' su
Ehm, se trovi qualcosa posta che serviva anche a me (poi avevo risolto in un altro modo il mio problema, ma potrei riaverlo) e credo che possa servire ad altri
Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00
se sono ammessi anche gli operatori di shift, ti puoi risolvere il problema per la moltiplicazione e la divisione di un numero in potenze del due proprio con questi due operatori:
var <<= n; // moltiplica var per 2^n
var >>= n; // divide var per 2^n
Ma con questo ti risolvi una minima parte del problema, quanto al resto non ho la soluzione pronta VVoVe: dovrei pensarci ma al momento il mio cervello è in stack overflow!
non credo che le cose siano così , il compilatore le traduce in opcodes che poi sono risolti direttamente dal processore. In fondo se il processore non avesse nemmeno istruzioni per eseguire le operazioni elementari, allora saremmo ancora molto indietro con la tecnologia...Il compilatore infatti traduce le operazioni +, - etc in operazioni bit a bit...
questo è vero...cmq il mio problema proprio richiedeva di creare qs operazione aritmetiche cm una sorta di livello di microprogrammazione...
non credo che le cose siano così , il compilatore le traduce in opcodes che poi sono risolti direttamente dal processore. In fondo se il processore non avesse nemmeno istruzioni per eseguire le operazioni elementari, allora saremmo ancora molto indietro con la tecnologia...
si sono ammessi gli shift anche con riporto e le rotazioni d'altra parte se lo shift e la rotazione nn sono bit a bit
inoltre sono ammessi gli &, |,~(ossia and or e complemento a 1)
Certo, i compilatori traducono il programma in codice macchina... Piu' o meno lo traducono in assembler e lo essemblano...Originariamente inviato da SnakePlissken
non credo che le cose siano così , il compilatore le traduce in opcodes che poi sono risolti direttamente dal processore. In fondo se il processore non avesse nemmeno istruzioni per eseguire le operazioni elementari, allora saremmo ancora molto indietro con la tecnologia...
Ma penso che l'obiettivo di 9178angel era piu' o meno fare questo...
In effetti comunque non mi sono espresso bene
Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00
ecco la somma...nn sn cm ci sia riuscita cmq esce
codice:int temp=0; //contiene il risultato della somma di due bit int tot=0; //totale int Bit=1; //utilizzato per azzerare i bit di un numero int Carry=0; //riporto int Position=1; //indica la posizione in cui va shiftato il carry int somma_bit_bit(int first, int second) //La funzione esegue la somma fra due bit e ne restituisce il risultato { first = first & Bit; /*vengono azzerati tutti i bit tranne quello dove è presente 1 */ second= second & Bit; if(Carry!=0) //se il riporto non è uguale a 0 { temp=first^second^Carry; //viene effettuata la somma fra i due bit //con il riporto if(first==0 && second==0) //se il 1° BIT=0 ed il 2° BIT=0 Carry=0; //allora non vi è riporto al bit successivo else { Carry = 1; /vi è riporto al bit successivo e tale Carry=Carry<<Position; //riporto viene shiftato di n posizioni // per essere sommato al bit giusto } Position++; //la posizione del riporto viene increm. al bit succ. Bit=Bit<<1; //bit viene shiftato a sinistra di una posizione //per l'AND succ. return temp; //viene restituita la somma fra i due bit esaminati } if(Carry==0) //se il riporto è uguale a 0 { temp=first^second^Carry; //viene effettuata la somma fra i due //bit con l'aggiunta del riporto if(first!=0 && second !=0) //se il 1° BIT=0 ed il 2° BIT=0 { Carry=1; //vi è riporto al bit successivo Carry=Carry<<Position; //e tale riporto viene shiftato di n posizioni //per essere sommato alla prossima iterazione } else Carry = 0; //altrimenti non vi è riporto al bit successivo Position++; //la posizione del riporto viene incrementata //al bit successivo Bit=Bit<<1; //bit viene shiftato a sin. di una posizione //per l'AND della prossima iterazione. return temp; //viene restituita la somma fra i due bit presi //in esame } } void main(void) { int num1; //Primo addendo da inserire int num2; // Secondo addendo da inserire int count; //contatore int risp; do { cout<<"1) Somma Algebrica fra due numeri\n"; cout<<"2) Esci\n\n"; cout<<"Digita la tua scelta: "; cin>>risp; switch(risp) { case 1: { cout<<"\nInserisci il 1° numero: "; cin>>num1; cout<<"Inserisci il 2° numero: "; cin>>num2; //NB:1byte=8bit--->int=4byte--->int=32bit for(count=1; count <= sizeof(int)*8; count++) { tot = tot + somma_bit_bit(num1, num2); /*viene calcolato il totale come somma dei risultati parziali ottenuti dalla funzione somma_bit_bit iterata per 16 volte, tanto quanto la grandezza di un intero in C++*/ } cout<<"\n Totale: "<<tot<<"\n\n"; /*REINIZIALIZZAZIONE DI TUTTE LE VARIABILI PER LA SOMMA SUCCESSIVA*/ temp=0; tot=0; Bit=1; Carry=0; Position=1; break; } case 2: continue; default: cout<<"RISPOSTA ERRATA\n\n"<< num1; break; } } while(risp!=2); }
scusate l'ho scritto in maniera disordinata
la differenza potrebbe essere trattata a somma facendo il complemento a uno!!!ora provo!!!!
rettifico, il complemento a uno nn funziona...ma cn il complemento a due...zì ora però devo vedere cm farlo...mah!
ok il complemento a due lo faccio cn l'incremento...
num2=~num2;
num2++;
e poi si rikiama la somma!!!