Seite 2 von 4
Verfasst: 04.12.2006 23:31
von AND51
remi_remeier hat Recht! Außerdem darf man nicht vergessen, das man Macros benutzt, man unterliegt also keinerlei Geschwindigkeisteinbußen bei der Performance (anders als bei Proceduren).
Verfasst: 05.12.2006 02:51
von al90
Mal so auf die schnelle.
Code: Alles auswählen
a.l=1
If (a/2)*2=a
Debug "Gerade"
Else
Debug "Ungerade"
EndIf
Verfasst: 05.12.2006 09:11
von Froggerprogger
@NULL
Beachte aber, dass PB liefert
entgegen jeder Restklassenringtheorie...
Verfasst: 05.12.2006 09:18
von #NULL
ich weiß nicht was eine Restklassenringtheorie ist, aber da -1 zu #true geboolcasted wird (natürlich nur, wenn sauch einer stattfindet), reicht es ja eigentlich.
aber ihr hab schon recht, so ein macro kann vorteile haben.
Verfasst: 05.12.2006 09:25
von Froggerprogger
Ohje, schaut euch das mal an:
Code: Alles auswählen
a.l = -3
Debug -3 % 2 ; liefert -1
Debug a % 2 ; liefert 1
Is it a bug ? No, a feature!
[bla]
Bzgl. Restklassen:
'Eigentlich' nach Definition der Restklassenringe über "Faktorgruppe Z / nZ" (egal) wird eine Zahl z aus Z eindeutig dargestellt durch z = f*n + k für f in Z, festes n und 0 <= k < n und dann in die "Klasse" zu k gepackt.
Daher ist eigentlich z.B: 2 % 3 = 2, 1 % 3 = 1, 0 % 3 = 0, -1 % 3 = 2, -2 % 3 = 1, ...
[/bla]
Verfasst: 05.12.2006 09:41
von NicTheQuick
Froggerproggers Methode wäre auch meine Idee. Man könnte IsEven
allerdings auch so abändern, was wahrscheinlich nichts am Speed ändern
würde:
Code: Alles auswählen
Macro isOdd(number)
number & 1
EndMacro
Macro isEven(number)
(~number & 1)
EndMacro
For i = -15 To 15
Debug i
Debug isOdd(i)
Debug isEven(i)
Next
Verfasst: 05.12.2006 10:05
von Tafkadasom2k5
@NTQ:
Was bedeutet die Tilde in deinem Code?
Gr33tz
Tafkadasom2k5
Verfasst: 05.12.2006 10:14
von #NULL
bitwise not
~00110011100
=11001100011
Verfasst: 05.12.2006 11:13
von Helle
Der schöne ASM-Befehl "TEST" lässt den Prüfling unversehrt (im Gegensatz zu fast allen anderen Beispielen hier; Operation gelungen, Patient tot

).
Code: Alles auswählen
Procedure OddEven(number)
!xor eax,eax
!test byte[p.v_number],1
!jz even
!inc eax
!even:
ProcedureReturn
EndProcedure
For i = -15 To 15
Debug i
Debug OddEven(i)
Next
Gruss
Helle
Verfasst: 05.12.2006 11:14
von Shardik
Wie wäre es denn mit zwei Zeilen Assembler?
Code: Alles auswählen
Procedure IsOdd(Value.L)
!MOV EAX,DWORD [p.v_Value]
!AND EAX,$00000001
ProcedureReturn
EndProcedure
For i = -3 To 7
Debug Str(i) + " => " + StrU(IsOdd(i), #Long)
Next i