Seite 2 von 2

Re: Operator NOT

Verfasst: 31.10.2009 18:17
von Thorium
TomS hat geschrieben: Außerdem: Was heißt alle Bits werden umgekehrt? Dann ist das Ergebnis doch das Maximale für den jeweiligen Typ.

Für einen Typ, der aus 2 Bits besteht: XX
0=00
1=01
2=10
3=11 (Alle Bits wurden von 0 auf 1 gekippt -> Ergebnis ist 3)
Es gibt in PureBasic keinen Typ der aus 2 Bits besteht. Minimum sind 8 Bit also 1 Byte. Wobei der Standarttyp Integer ist: 32bit bei x86 und 64bit bei x64. -1 weil es keinen vorzeichenlosen Integertyp in PB gibt.
STARGÅTE hat geschrieben: Du meinst das Binäre NOT : nämlich die ~
Dort ist ~0 = -1

Aber das Schlüsselwort NOT ist kein binärOperator
Ja richtig, sorry, mein Fehler.

Re: Operator NOT

Verfasst: 31.10.2009 18:21
von Josh
es geht mir ja da mehr ums prinzip. dass in basic das zeichen "=" einerseits als zuweisungsoperator und andererseits als vergleichsoperator verwendet wird, ist mal ein grundsätzliches problem bei basic.
STARGÅTE hat geschrieben:kann ich die Aussage A = B auch als Variable speichern
sorry, deiner aussage kann ich jetzt leider nicht folgen. woraus soll sich da ein resultat ergeben, dass ich in einer variablen speichern kann?

im gegensatz dazu ergibt NOT aber sehr wohl ein resultat, dass ich folglich dann ja auch in einer variablen speichern kann.

durch das if ist ja festegelegt, dass es sich um einen vergleichs und nicht um einen zuweisungsoperator handelt. also ich kann ja total daneben liegen, aber nach meiner vorstellung wird ein if befehl wie folgt aufgelöst

IF 2 = 3 AND 3 = 3
IF false AND true
IF false

bei mir setzt es da halt aus, warum ich ein ergebnis:
- dass ich berechnen kann
- dass ich mit debug anzeigen kann
- dass ich mit dem MessageRequester ausgeben kann
nicht in einer variable speichern kann.

Code: Alles auswählen

Debug #True Or #False
b = #True Or #False
Debug b
MessageRequester("", Str(#True Or #False))

Re: Operator NOT

Verfasst: 31.10.2009 18:33
von Thorium
Gerade im englischen Forum gelesen das soetwas in Planung ist: http://www.purebasic.fr/english/viewtop ... 8&start=19

Re: Operator NOT

Verfasst: 31.10.2009 18:39
von TomS
Thorium hat geschrieben:Es gibt in PureBasic keinen Typ der aus 2 Bits besteht. Minimum sind 8 Bit also 1 Byte.
Schon klar. Aber auch bei 8 bit wird aus 0 11111111 wenn man alle Bits umdreht. Mir ging's um's Prinzip.
Thorium hat geschrieben:-1 weil es keinen vorzeichenlosen Integertyp in PB gibt.
Das heißt es werden eigentlich nur 31/63 für die Zahl verwendet und ein Bit für's Vorzeichen? Müsste dann bei 32 bit Integer nicht 2^31*(-1) = -2147483648 rauskommen anstatt -1?

Re: Operator NOT

Verfasst: 31.10.2009 18:49
von Thorium
TomS hat geschrieben: Schon klar. Aber auch bei 8 bit wird aus 0 11111111 wenn man alle Bits umdreht. Mir ging's um's Prinzip.
Das kommt auf den Typ drauf an by .b hast du hier auch -1 beim neuen (PB 4.40) Typ .a hast du hier 255.
TomS hat geschrieben: Das heißt es werden eigentlich nur 31/63 für die Zahl verwendet und ein Bit für's Vorzeichen?
Genau.
TomS hat geschrieben: Müsste dann bei 32 bit Integer nicht 2^31*(-1) = -2147483648 rauskommen anstatt -1?
Nein. Das letzte Bit gibt das Vorzeichen an, ist es gesetzt wird quasie rückwärts gezählt.

Also:
1 1 1 1 1 1 1 1 = -1
0 1 1 1 1 1 1 1 = 127

Re: Operator NOT

Verfasst: 31.10.2009 18:55
von TomS
Aha. Das heißt im Umkehrschluss 0 1 1 1 1 1 1 1 = - 127?

Re: Operator NOT

Verfasst: 31.10.2009 19:28
von DarkDragon
Angenommen du willst 127 zu -127 machen, dann invertierst du die Bits von 127 und addierst 1 dazu:

Code: Alles auswählen

127
0111 1111
1000 0000 + 1
1000 0001
-127 ist demnach 1000 0001 im Zweierkomplement.
Und -1 ist 1111 1111 ;-)

Natürlich geht das auch andersrum.

Code: Alles auswählen

test.b = %11111111
Debug test
Probier einfach mal selbst rum. Normalerweise würde ich dir jetzt den Zweierkomplementring zeigen, aber ich find grad kein Bild im Netz.

Re: Operator NOT

Verfasst: 31.10.2009 21:03
von TomS
Äh. Mein Post von vorhin war kompletter Murks. Ich meinte natürlich 10000000.
Ah, Ok. also noch +1.
Ok, Ok. Jetzt hab ich's wohl kapiert. Danke :)

Re: Operator NOT

Verfasst: 31.10.2009 21:46
von Kaeru Gaman
zum Vorzeichenbit:
das verhalten des Bytes bleibt identisch, egal ob es signed oder unsigned interpretiert wird.
also, wenn man immer um +1 erhöht, und das byte ist voll, erhält man wieder 0.
wenn das höchste bit als Vorzeichen interpretiert wird, dann darf sich dieses verhalten nicht ändern,
außerdem muss -1 +1 ja 0 ergeben.

wenn man also alle bits gesetzt hat außer dem höchsten, und addiert 1,
dann wird das höchste bit gesetzt und alle anderen gelöscht,
und diese zahl muss dann die allerkleinste negative zahl dieses typs sein.

wenn man das erstmal gefressen hat, ist es so logisch, dass man garnicht mehr anders denken kann.


zum Not
in PureBasic gibt es zwei Typen Logische Operatoren,
die Vergleichsoperatoren und die Arithmetischen Operatoren.
And, Or, Xor und Not gehören nur in Vergleiche,
& | ! und ~ sind für Bit-Operationen.

in manchen Sprachen kann man Logische Operatoren und Vergleiche in einem Term verwenden.
dort erhält dann der Term (A=5) den Wert #True, wenn A fünf ist, und #False wenn A etwas anderes ist.
in PureBasic ging das noch nie und geht bisher auch nicht, allerdings ist geplant, eine Boolean()-Funktion hinzuzufügen.