Gerade oder ungerade Zahlen feststellen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag 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
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

@NULL
Beachte aber, dass PB liefert

Code: Alles auswählen

-3%2 = -1
entgegen jeder Restklassenringtheorie...
!UD2
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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]
!UD2
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

@NTQ:
Was bedeutet die Tilde in deinem Code?

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

bitwise not

~00110011100
=11001100011
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Antworten