Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    simulare operazioni aritmetiche

    è possibile simulare le operazioni aritmetiche su interi usando le operazioni bit a bit?

  2. #2
    ehm scusate ho dimenticato il linguaggio...si tratta di c++

  3. #3
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    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

  4. #4
    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!

    Il compilatore infatti traduce le operazioni +, - etc in operazioni bit a bit...
    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...



  5. #5

    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...
    questo è vero...cmq il mio problema proprio richiedeva di creare qs operazione aritmetiche cm una sorta di livello di microprogrammazione...

    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)

  6. #6
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    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...
    Certo, i compilatori traducono il programma in codice macchina... Piu' o meno lo traducono in assembler e lo essemblano...
    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

  7. #7
    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

  8. #8
    la differenza potrebbe essere trattata a somma facendo il complemento a uno!!!ora provo!!!!

  9. #9
    rettifico, il complemento a uno nn funziona...ma cn il complemento a due...zì ora però devo vedere cm farlo...mah!

  10. #10
    ok il complemento a due lo faccio cn l'incremento...

    num2=~num2;
    num2++;

    e poi si rikiama la somma!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.