Newsgroup: it.comp.lang.c++
Titolo: Bitwise, aiuto please!!!

Salve ragazzi,
 ho un problema che mi sta facendo perder molto tempo, questo algoritmo fa
l'addizione binaria tramite bitwise, finchè gli operandi sono positivi va
tutto bene,ma quando invece sono negativi sballa la somma, mi date una
mano??
Grazie mille
#include<stdio.h>
#include<stdlib.h>
int add_bin(int,int);
main(){
int a,b,c;
printf("dammi il primo numero intero \n");
scanf("%d",&a);
printf("dammi il secondo numero intero\n");
scanf("%d",&b);
c=add_bin(a,b);
printf("%d",c);
system("pause");
}
int add_bin(int a,int b){
int rip=1,somma;
while (rip>0)
{
    somma=(a^b);
    rip=(a&b);
    rip=rip<<1;
    a=somma;
    b=rip;
}
return a;
}

 mano??
[CUT]
A parte il fatto che dovresti rivedere i tuoi sorgenti che non sono C++ 
standard, credo che il tuo problema risieda nel rappresentazione dei 
numeri interi negativi sul tuo sistema.
Non credo che sia uguale dappertutto e dovresti controllare.
In genere quando il bit piů significativo č posto ad 1 il numero č 
considerato negativo.
ad es con un intero di 8bit:
0000 0001 ===> +1
1000 0001 ===> -1
Puoi stampare la configurazione binaria di un numero intero e del suo 
opposto per renderti conto della particolare rappresentazione 
implementata sul tuo sistema e regolarti di conseguenza.
-- 
Domenico Testa

 implementata sul tuo sistema e regolarti di conseguenza.
Si, anche se in genere la maggior parte delle macchine (non tutte) usa il
complemento a due (two's complement) e questo e' abbastanza diverso da
quello che descrivi....
0000 0001 ===> +1
1111 1111 ===> -1
quello che descrivi non e' nemmeno il complemento ad uno (one's complement),
ma molto piu' semplicemente il metodo "sign and magnitude" che non credo sia
utilizzato da nessun moderno calcolatore.
Tommy

 ha scritto nel messaggio
news:c0rm5u$17o$1...@titan.btinternet.com...


 i numeri negativi devono essere rappresentati tramite il complemento a
due.
questo discorso e' OT, ma hai detto una cosa non vera: per esempio il PDP-1
(1960) e l' UNIVAC/UNISYS (1962->~1990) usavano il complemento ad uno!
In sostanza ripeto il concetto che ho detto:
"Si, anche se in genere la maggior parte delle macchine (non tutte) usa il
complemento a due (two's complement)"
Il fatto che il complemento a due sia oramai praticamente uno standard
universale non vuole dire che *debba* essere utilizzato e nemmeno che sia
sempre stato utilizzato!
Tommy

>> utilizzato da nessun moderno calcolatore.
Avevo pensato bene di accennare il complemento a due per evitare confusioni
in quanto e' praticamente lo standard universale per moderni calcolatori...
ma, ancora una volta... "i numeri negativi *NON* devono per forza essere
rappresentati con il complemento a due" ;-)
Tommy

 sempre stato utilizzato!
Si intendeva che col complemento a 2 le somme/sottrazioni non creano 
problemi di calcolo.... 
-- 
Luc

 problemi di calcolo....
come fai a sapere cosa "si" intendeva?
io non ho la sfera di cristallo e nemmeno molti altri ;-)
se voleva dire questa cosa poteva essere esplicito quanto lo sei stato
tu...
Tommy
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

> i numeri negativi devono essere rappresentati tramite il complemento
a due.
"Devono" ?! dove sta scritto ?
Esistono molti modi di rappresentare i numeri negativi.  Sicuramente,
uno dei più usati oggi è il complemento a due, ma non è detto che
necessariamente tutte le macchine lo utilizzino.

 problemi di calcolo....
Huh ?!
Neanche con gli altri sistemi.

 Neanche con gli altri sistemi.
Adesso sono "arriginito" sull'argomento, ma c'è un grosso vantaggio per 
il complemento a 2... Stasera magari riprendo il mio libro di Sistemi... 
;)
-- 
Luc

 arriginito
arrUginito 
-- 
Luc

>> il complemento a 2... Stasera magari riprendo il mio libro di
Sistemi...
L'unico vantaggio è che la differenza è comunque gestita come somma, a
meno del resto sull'ultimo bit[1].  In ogni caso, non esistono
"problemi" di sorta utilizzando gli altri sistemi.
[1] 9 - 3 = 1001 (9) +
            1101 (3 in c.a.2.) =
           10110
       1<-- 0110 (6)

 L'unico vantaggio è che la differenza è comunque gestita come somma
Bene, allora l'OP ha raggiunto il suo scopo. 
-- 
Luc

>>>Bene, allora l'OP ha raggiunto il suo scopo.
Sei tu che, come al solito, non hai raggiunto il tuo.

 Sei tu che, come al solito, non hai raggiunto il tuo.
? 
-- 
Luc

 ha scritto nel messaggio
news:c0sq5u$1b3s7l$1...@ID-221370.news.uni-berlin.de...


 COMPLEMENTO A DUE"
In questo caso, visto che non puoi sapere se i negativi sono
rappresentati in complemento a due, perché ti stai affidando alla tua
implementazione, il codice che hai scritto non è portabile.  Devi
leggere i numeri, trasformarli esplicitamente in complemento a due e
poi compiere l'addizione.

 COMPLEMENTO A DUE"
oh, e finalmente ti sei riuscito a fare capire!!!!
negli altri post sei stato poco chiaro....
ok...
sono sicuro si possa fare molto di meglio, ma questo e' quello che mi e'
venuto in un secondo. detto questo non mi piace per nulla:
<CODE>
int BitwiseSomma(int a, int b)
{
 int ris = 0, resto = 0, count = 0;
 for(unsigned int mask=1; mask; mask <<= 1, count=0){
  ris |= ((a&mask)^(b&mask))^(resto);
  if(a&mask) ++count;
  if(b&mask) ++count;
  if(resto) ++count;
  if(count > 1)
   resto = mask<<1;
  else
   resto = 0;
 }
 return ris;
}
</CODE>
nonostante non mi piaccia spero ti possa aiutare... dovrebbe funzionare sia
con numeri negativi che positivi dando per scontato che l'architettura usi
un complemento a due.
Tommy

 ha scritto nel messaggio
news:c0td8o$ad0$1...@hercules.btinternet.com...


il complemento a 2...
   Almeno non ha lo zero negativo, pero` a = -a puo` dare risultati
inattesi in casi limite. :)
-- 
S.L.