Das ist zwar beides weitere Möglichkeiten, aber ich glaube nicht, dass sie so
schnell sind wie die anderen, weil ihr Procedures benutzt.
Aber falls ihr nur mit ASM angeben wolltet, ist das okay.

Code: Alles auswählen
!test byte[v_pruefling],1
!jz l_even
;mache was wenn ungerade
!jmp l_weiter
even:
;mache was wenn gerade
weiter:
Code: Alles auswählen
Macro IsOdd(number)
(number & 1)
EndMacro
A = -17
While A < 18
A$ = Str(A) + " => " + Str(IsOdd(A))
Debug A$
A+1
Wend
Das mit dem Angeben könnte man wohl wirklich so verstehenNicTheQuick hat geschrieben: @Helle, Shardik:
Das ist zwar beides weitere Möglichkeiten, aber ich glaube nicht, dass sie so schnell sind wie die anderen, weil ihr Procedures benutzt.
Aber falls ihr nur mit ASM angeben wolltet, ist das okay.![]()
Code: Alles auswählen
a = -1
Debug -1 % 2
Debug a % 2
Code: Alles auswählen
int a = -7;
System.out.println(a % 4); // liefert -3
Code: Alles auswählen
int a = -7;
printf("%i", (a % 4)); // liefert -3
Code: Alles auswählen
a = -7
Debug a % 4; liefert 1
Code: Alles auswählen
Procedure PosMod(a, n) ; return a % n with a in [0, n-1]
Protected b.l
b = a % n
If b < 0
ProcedureReturn b + n ; 'shift representative' by n
Else
ProcedureReturn b
EndIf
EndProcedure
Debug PosMod(-5, 3)
Debug PosMod(-4, 3)
Debug PosMod(-3, 3)
Warum? Ist doch praktisch, z. B. bei Winkeln:remi_meier hat geschrieben:Irgendwie kann ich mit einem negativen Operanden bei Modulo nix anfangen.
Also mich stört es nicht, dass es für negative Zahlen nicht immer geht.
Code: Alles auswählen
Procedure Modulo(a.l, b.l)
If b < 0 : b = -b : EndIf
a % b
If a < 0 : a + b : EndIf
ProcedureReturn a
EndProcedure
For x.l = -360 To 360 Step 36
Debug Str(x) + " % 360 = " + Str(Modulo(x, -360))
Next
Code: Alles auswählen
Procedure.f ModuloF(a.f, b.f)
If b < 0 : b = -b : EndIf
a - Int(a / b) * b
If a < 0 : a + b : EndIf
ProcedureReturn a
EndProcedure
a.f = -6.2831
While a < 6.2831
Debug StrF(a) + " % 6.2831 = " + StrF(ModuloF(a, 6.2831))
a + 0.4
Wend
Code: Alles auswählen
a.q = -7
Debug a % 4 ; liefert -3!
Code: Alles auswählen
; a1.l=a%4
MOV ebx,dword [v_a]
AND ebx,3
MOV dword [v_a1],ebx