# Vorzeichen.Bit negieren



## roman_drechsel (12. März 2005)

Hallo,

  wie kann ich mit Bit-Operatoren das Vorzeichen-Bit einer int-Zahl negieren (also das linke Bit)?


----------



## Endurion (12. März 2005)

Bei einem 32-bit-Wert sollte ^= 0x80000000 das tun. Ich meine, das würde sogar bei float gehen (kommt auf das float-Verfahren an).


----------



## roman_drechsel (12. März 2005)

```
int MINUS(int a, int b) {
   	int erg;
   
   	a ^= 0x80000000;
   	b ^= 0x80000000;
   
   	printf("a = %d\n",a);
   	printf("b = %d\n",b);
   	erg = a+b;
   	erg ^= 0x80000000;
   	return erg;
   }
```
   was is daran falsch? Sry aber ich hab große Probs, die Arbeit mit Bit-Operatoren zu verstehen.


----------



## Endurion (12. März 2005)

Du müsstest da nur b (das abgezogen werden soll) negieren, nicht beide. Sonst ist es lediglich eine Addition.

Zur Zeit machst du aus 1+2  -1+(-2), gibt -3, einmal negiert, gibt 3.


----------



## roman_drechsel (12. März 2005)

also der Code sieht jetz so aus:

```
int MINUS(int a, int b) {
  	int erg;
  
  	b ^= 0x80000000;
  
  	printf("a = %d\n",a);
  	printf("b = %d\n",b);
  	erg = a+b;
  	return erg;
  }
```
  bei a = 5 und b=3 kommt folgende Ausgabe:

  a = 5
  b = -2147483645
  und der Rückfgabewert ist "-2147483640"

  wo liegt der Fehler, was muss ich ändern?


----------



## Tobias K. (12. März 2005)

moin


Was willst du überhaupt damit bezwecken? Bzw. wofür ist das ganze gut?


mfg
umbrasaxum


----------



## roman_drechsel (12. März 2005)

Ich muss für die Schule ne Funktion schreiben, die mit Bit-Operatoren das MINUS(-) nachbildet.


----------



## Tobias K. (12. März 2005)

moin


So gehts:

```
unsigned int a, b;
	int erg;

	a=3;
	b=5;

	b ^= 4294967294;

	printf("a = %d\n",a);
	printf("b = %d\n",b);
	erg = a+b;

	printf("\n\n%d", erg);
```


mfg
umbrasaxum


----------



## Endurion (13. März 2005)

Upps, das kommt davon, wenn man seine Angaben nicht testet


----------



## mffm (14. März 2005)

Hallo,

 so paßt es auch noch nicht ganz. Das Vorzeichen einer Zahl wird (wenn die Zweierkomplement-Darstellung benutzt wird) auf diese Art negiert:


```
unsigned int a, b;
   int erg;
   
   a = 3;
   b = 5;
   
 b = ~b + 1;
   
   printf("a = %d\n",a);
   printf("b = %d\n",b);
   erg = a+b;
   
   printf("\n\n%d", erg);
```
 
   Gruß
   Flo


----------



## Beichtpfarrer (14. März 2005)

mffm hat gesagt.:
			
		

> Hallo,
> 
> so  paßt es auch noch nicht ganz. Das Vorzeichen einer Zahl wird auf diese Art negiert:
> 
> ...



was willst du:


```
void minus(int a,int b){
 int erg;

 cout << "a = " << a << "\nb = " << b << endl;

 erg = a+b^0x80000000;
 //oder: erg = a + ~b+1;

 cout << "a-b = " << erg << endl; }
```

Kennst du denn die Bedeutung der Bitoperatoren?
Du solltest dir die mal genauer anschauen, was die machen.


----------



## mffm (14. März 2005)

Hallo Beichtpfarrer,




			
				Beichtpfarrer hat gesagt.:
			
		

> Kennst du denn die Bedeutung der Bitoperatoren?
> Du solltest dir die mal genauer anschauen, was die machen.


 
  Ich kann nicht ganz verstehen, was Du mir vorwirfst.
 Ich bin davon ausgegangen, daß die negativen Zahlen in der üblichen Zweierkomplement-Schreibweise dargestellt sind und nicht in der Schreibweise "Vorzeichen + Betrag". Und das Zweierkomplement habe ich mit meinem obigen Code erstellt, auch wenn der XOR-Operator sicher nicht optimal war.

  Das Programm sollte auf den allermeisten Rechnern korrekt funktionieren, während dieses


```
erg = a+b^0x80000000;
```
 
  wohl nur selten ein richtiges Ergebnis berechnen wird.

  Gruß
  Flo


----------



## Beichtpfarrer (14. März 2005)

Hey, das war kein Vorwurf.
Das war die Frage, weil ich es vorher irgenwie so verstanden habe, dass du gesagt hast, du wüsstest nicht ganz, wie der Operator funktioniert oder so....
Das Zweierkomplement liefert dir den negativen Wert... 
stimmt... das ^0x80000000 tut das nicht.. (uuuppps  auch mein Fehler)
Ich hab das nicht weiter überdacht, da das höchste Bit durchaus etwas mit positiv bzw negativ zu tun hat... aber nicht in dieser Weise anwendbar...


edit: oups ich hab das was ganz falsch verstanden, löl...
Ich dachte, du wärst derjenige, der die Frage gestellt hat...
Außerdem hab ich deinen Beitrag irgenwie falsch gelesen...


----------



## jokey2 (14. März 2005)

Noch'n kleiner Tip:
die Variablen als 'long int' bzw. 'short int' deklarieren, dann haben sie auf jeder Maschine eine Länge von 32 bzw. 16 Bit. Nur 'int' wird von unterschiedlichen Compilern auf unterschiedlichen Maschinen auch unterschieldlich interpretiert, d.h. nicht überall gilt 'int == long int'
Aber das nur am Rande.

jokey2


----------



## mffm (14. März 2005)

Beichtpfarrer hat gesagt.:
			
		

> edit: oups ich hab das was ganz falsch verstanden, löl...
> Ich dachte, du wärst derjenige, der die Frage gestellt hat...
> Außerdem hab ich deinen Beitrag irgenwie falsch gelesen...


 
 Ach so, dann ist ja alles klar 
 Ich hatte mich schon gewundert.


----------

