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

Code: Alles auswählen

-3%2 = -1
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 :mrgreen: ).

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