amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Bit von Word extrahieren [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

11.06.2006, 14:06 Uhr

MaikG
Posts: 5172
Nutzer
Ich möchte von einem Word z.B. Bit 9 einzeln haben.

Ich dachte das geht so irgendwie:

(a& AND 65535)\512


aber da haut irgendwas nicht hin. Wie muss ich das rechnen?

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 14:25 Uhr

DrNOP
Posts: 4118
Nutzer
Ja, so irgendiwe geht das schon ... die Feinheiten der Vorgehensweise hängen an der verwendeten Programmiersprache. Hattest du eine bestimmte im Sinn?

Es wird sicher zum Schreiben einfacher, wenn du deine Werte gleich als Hex- oder Binärwert angibst.
Und "extrahieren" läßt Spielraum für Interpretationen: Willst du es ausmaskieren, so daß alle Bits außer Bit 9 auf jeden Fall Null sind aber es steht immer noch an Position 9, oder willst du es außerdem verschieben an Position 0?
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 14:31 Uhr

Ralf27
Posts: 2779
Nutzer
@MaikG:

Ich kann dir da zur Zeit leider mit Basic helfen:

a=(a and 512)\512


--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 14:33 Uhr

MaikG
Posts: 5172
Nutzer
>Ja, so irgendiwe geht das schon ... die Feinheiten der
>Vorgehensweise hängen an der verwendeten Programmiersprache. Hattest
>du eine bestimmte im Sinn?

Ja, Basic.

AND ist ja bekannt, \ bedeutet eine Division ohne Kommastellen.


>Es wird sicher zum Schreiben einfacher, wenn du deine Werte gleich
>als Hex- oder Binärwert angibst.


Dec ist in MaxonBasic schneller.


>Und "extrahieren" läßt Spielraum für Interpretationen: Willst du
>es ausmaskieren, so daß alle Bits außer Bit 9 auf jeden Fall Null
>sind aber es steht immer noch an Position 9, oder willst du es
>außerdem verschieben an Position 0?

Wenn Bit9=1 ist möchte ich als ergebniss 1, wenn nicht 0, alle
anderen Bits sollen ignoriert werden.

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 18:59 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von MaikG:
Wenn Bit9=1 ist möchte ich als ergebniss 1, wenn nicht 0, alle
anderen Bits sollen ignoriert werden.

Dann sollte Ralf27's Vorschlag doch funktionieren, oder? Falls nicht, solltest du vielleicht noch ein paar Sätze auf das "irgendwas" aus
Zitat:
aber da haut irgendwas nicht hin.
verwenden.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 19:10 Uhr

MaikG
Posts: 5172
Nutzer
>Ich kann dir da zur Zeit leider mit Basic helfen:

>a=(a and 512)\512

Okay also das was ich will 2x, bei 1 Bit.


>Dann sollte Ralf27's Vorschlag doch funktionieren, oder? Falls
>nicht, solltest du vielleicht noch ein paar Sätze auf das
>"irgendwas" aus

Probier ich gleich nachher, hab 3 Minuten zum schreiben gebraucht :-)

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 19:12 Uhr

Ralf27
Posts: 2779
Nutzer
@MaikG:

Wenn die Überprüfung auf Bit 9(oder jedes andere) nur auf gesetzt oder nicht gehn soll, dann könnte man es auch so machen:

if a and 512 then print "Ja, ich bin gesetzt :) "

Es gibt einige Wege.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 19:18 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
>Es wird sicher zum Schreiben einfacher, wenn du deine Werte gleich
>als Hex- oder Binärwert angibst.

Dec ist in MaxonBasic schneller.


Wie meinst du das? Es ist doch eigentlich egal wie ich denn Zahlenwert angebe, die Zahlen werden dann doch später beim compilieren wieder umgewandelt.

Ob ich jetzt 10 schreiben oder &hA dürfte das gleiceh sein, bzw. 255 oder &hFF.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 22:27 Uhr

MaikG
Posts: 5172
Nutzer
>Es gibt einige Wege.


Ich denke mal der mit and und dann \ ist am besten.
Nur ich würde gerne die rechnung an sich mal begreifen.
Wenn ich jetzt z.B. 2 Bit oder 4 Bit haben will, gibts
da sowas wie ein Rechenweg?


>Wie meinst du das? Es ist doch eigentlich egal wie ich denn
>Zahlenwert angebe, die Zahlen werden dann doch später beim
>compilieren wieder umgewandelt.


if a&=65535 then
ist schneller als
if a&=&hFFFF then

frag mich nicht warum, hab mir notiert das DEC in dem falle schneller
ist.


Weisst du zufällig auch wie man die 2. und 3. Maustaste abfragt?
In Englisch hab ich gelesen man muss DFF016 lesen, 0c00 mit AND
hinzufügen und in DFF034 schreiben. Ich bekomme beim auslesen
jedoch nur die Maustasten, nicht die vom Joystik(bleiben 0).

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 23:13 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von MaikG:
>Es gibt einige Wege.


Ich denke mal der mit and und dann \ ist am besten.
Nur ich würde gerne die rechnung an sich mal begreifen.
Wenn ich jetzt z.B. 2 Bit oder 4 Bit haben will, gibts
da sowas wie ein Rechenweg?


In der Tat. Der Wert, mit dem Du den Ursprungswert AND-verknüpfen mußt, um zu erfahren, ob das gewünschte Bit gesetzt ist oder nicht, ergibt sich aus der 2 hoch Bitnummer.

Um bei dem schon genannten Beispiel zu bleiben:

2 hoch 9 = 512 dec.

2 hoch 10 = 1024 dec.

...

Zitat:
>Wie meinst du das? Es ist doch eigentlich egal wie ich denn
>Zahlenwert angebe, die Zahlen werden dann doch später beim
>compilieren wieder umgewandelt.


if a&=65535 then
ist schneller als
if a&=&hFFFF then

frag mich nicht warum, hab mir notiert das DEC in dem falle schneller
ist.


Äh... das wäre etwas seltsam, da ein Compiler (sofern er was taugt), die Zahlenwerte einer Konstante direkt in Bitmuster wandelt. Da spielt es keine Rolle, ob der Wert ursprünglich als Dezimal- oder Hexadezimalzahl angegeben wurde. Das einzige, was da einen Unterschied machen könnte sind die Zweierpotenzen. Allerdings wäre auch das (wie oben bereits beschrieben) ziemlicher Schwachsinn seitens des Compilers (sprich: eine Konstante erst zur Laufzeit wandeln).

Zu der Abfrage der anderen Maustasten kann ich leider wenig sagen, da ich das noch nie "direkt an der Hardware" gemacht habe beim Amiga.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 11.06.2006 um 23:14 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 23:22 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
if a&=65535 then
ist schneller als
if a&=&hFFFF then

frag mich nicht warum, hab mir notiert das DEC in dem falle schneller
ist.

Ist für mich jetzt wirklich sehr verwunderlich (ich hab es auch noch nicht getestet), aber ok.
Zitat:
Weisst du zufällig auch wie man die 2. und 3. Maustaste abfragt?
In Englisch hab ich gelesen man muss DFF016 lesen, 0c00 mit AND
hinzufügen und in DFF034 schreiben. Ich bekomme beim auslesen
jedoch nur die Maustasten, nicht die vom Joystik(bleiben 0).


Ja, mit den Systembefehlen. Geht auch mit Basic. Dann kann man sogar auch das Mausrad abfragen (wenn ich das richtig in Erinnerung habe)
Dann dürfte das auch auf AOS4, MorphOS laufen.

Also einfach das Messagesystem von Inuition benutzen. Aber für das ganze sollte man Systemfenster benutzen, weil sonst der MBasic-Compiler sich mit deinem Programm "anlegt". :D Hab das selbst schon erleben dürfen als ich mich mit den Menus angelegt habe.

Wenn du genaue Infos brauchst, dann müßte ich nochmal nachsehn.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 23:31 Uhr

MaikG
Posts: 5172
Nutzer
>Um bei dem schon genannten Beispiel zu bleiben:

>2 hoch 9 = 512 dec.

>2 hoch 10 = 1024 dec.

Ja, das ist klar. Aber wenn ich jetzt
nicht ein Bit davon haben will sondern 2 oder 4(Word)?

>Äh... das wäre etwas seltsam, da ein Compiler (sofern er was taugt),

Maxon Basic

>Ja, mit den Systembefehlen. Geht auch mit Basic. Dann kann man sogar
>auch das Mausrad abfragen (wenn ich das richtig in Erinnerung habe)

Maus, ist ja klar aber Joystik?

>Also einfach das Messagesystem von Inuition benutzen. Aber für das
>ganze sollte man Systemfenster benutzen, weil sonst der
>MBasic-Compiler sich mit deinem Programm "anlegt". :D Hab das
>selbst schon erleben dürfen als ich mich mit den Menus angelegt habe.

Fenster ist nicht das Problem.

>Wenn du genaue Infos brauchst, dann müßte ich nochmal nachsehn.

Das währe nett, ich brauche Fire2 und Fire3.

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 23:39 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von MaikG:
>Es gibt einige Wege.


Ich denke mal der mit and und dann \ ist am besten.
Nur ich würde gerne die rechnung an sich mal begreifen.
Wenn ich jetzt z.B. 2 Bit oder 4 Bit haben will, gibts
da sowas wie ein Rechenweg?


na das ist doch ganz einfach, das AND sorgt dafür, dass nur noch das gewünschte Bit gesetzt ist, wenn du das Ganze noch durch den (Stellen-)Wert des Bits teilst, kommt halt nur noch eine 1 oder eine 0 heraus.

für das n-te bit halt

(a AND (2^(n-1)) / (2^(n-1))

falls du das Bit ganz Rechts mit 1 nummerierst.

Zitat:
frag mich nicht warum, hab mir notiert das DEC in dem falle schneller
ist.


es ist natürlich Vollkommen egal ob du den Wert als Hex oder Dezimalwert angibst, die CPU kann nur Binärwerte verarbeiten und vom Compiler werden die Entsprechend geliefert.

Bei einer Interpretersprache kann ggf. Dezimal schneller sein, wenn der Interpreter die entsprechenden Zeilen erst beim Ablauf übersetzt. Ich würde darauf aber nichts geben sondern so verfahren, dass ich Werte die Sich leichter in Hexadezimal lesen lassen, auch so übergebe.

z.B. kann aus 0x1234 sofort sehen welches das obere Byte und das untere Byte eines Word ist oder auch ob BIT #12 gesetzt ist, bei Dezimal sehe ich das nicht.

[ - Antworten - Zitieren - Direktlink - ]

11.06.2006, 23:44 Uhr

MaikG
Posts: 5172
Nutzer
>für das n-te bit halt
>(a AND (2^(n-1)) / (2^(n-1))

Ja, das hab ich schon begriffen, ich meine:

12345678

wenn ich jetzt z.B. 34 haben will oder 3456

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 00:00 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
Maus, ist ja klar aber Joystik?

Das währe nett, ich brauche Fire2 und Fire3.


Moment, meinst du jetzt verschiedene Joysticktasten? Hm, das wäre mal was neues, wenn es sowas überhaupt gibt. Aber mit Basic kannst du jeweils eine Taste pro Port abfragen.


Jetzt mal allgemein: es wäre neu für mich wenn es für den Amiga Joysticks geben würde die mehrere getrennt(!) abfragbare Tasten besitzen würden...


Und jetzt nochmal die HEX-Story:

Hab es eben mehrfach getestet, kein Unterschied. Es wäre auch wirklich seltsam gewesen, da ja auch DEZ-Zahlen intern umgewandelt werden. Somit es es egal ob der Compiler wärend des compilieren HEX, DEZ oder sonstige Formate umwandelt.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 00:01 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
>für das n-te bit halt
>(a AND (2^(n-1)) / (2^(n-1))

Ja, das hab ich schon begriffen, ich meine:

12345678

wenn ich jetzt z.B. 34 haben will oder 3456


Hm, wäre jetzt wirklich etwas kompliziert. Mach es doch mal einfacher:


bitmask=2^3+2^4

a=(a and bitmask)\bitmask

Wenn die bits 3 und 4 gesetzt sind, dann ist a=1
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 12.06.2006 um 00:02 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 00:14 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von MaikG:
>für das n-te bit halt
>(a AND (2^(n-1)) / (2^(n-1))

Ja, das hab ich schon begriffen, ich meine:

12345678

wenn ich jetzt z.B. 34 haben will oder 3456


das ist auch nicht so schwer, du musst zuerst dafür sorgen, dass der benötigte Wert erstmal Rechtsbündig steht, dafür musst du die Bits erstmal nach Rechts verschieben, z.B. um die 3456 zu erhalten musst du erstmal um 8 Bit nach Rechts verschieben, da noch 8 Bits rechts von 3456 stehen).

das erreichst du z.B. mit einer Ganzzahl Division, diese MUSS aber die Nachkomma stellen abschneiden, d.h. nicht aufrunden.

verschobener_wert = alter_wert / (2^bits_zum_verschieben)


für die 3456 z.B.

verschobener_wert = 12345678 / (2^8)

damit hat dein neuer Wert die Darstellung

xx123456

xx ist undefiniert nun musst du die Bits links von 3456 löschen, da 3456 16 Bits benötigt kannst du folgende Rechnung dafür nutzen

wert = verschobener_wert AND ((2^benötigte_bits) - 1)

die -1 sorgt dafür das nur noch die Bits die benötigt werden in der Maske gesetzt sind


[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 00:58 Uhr

whose
Posts: 2156
Nutzer
@DariusBrewka:

Mal ne ganz dumme Frage: Warum nicht ganz einfach die von Ralf angedeutete Möglichkeit der Maskierung mittels Maske in WORD-Breite benutzen?

Die Bitnummern sind ja bekannt (und auch wohl das, was Maik so beißt derzeit). Da kann man sich die Hin- und Herschieberei sparen. So weit mir bekannt ist, kann MaxonBasic auch mit Daten in Form von WORD oder LONGWORD umgehen.

Also schlicht 2 hoch (Bitnummer) + 2 hoch (nächste Bitnummer)... -> Bitmaske. Das Ganze mit dem aus dem Register kopierten Wert AND-verknüpfen und er weiß, ob die gewünschten Bits gesetzt sind oder nicht.

Bei Word-Breite ist auch der Tipp-/Kopfrechenaufwand bei Dezimalzahlen noch nicht so hoch, wie es bei Longword-Breite der Fall wäre (und selbst da kann man sich immer noch mit Hexadezimalzahlen retten). Dazu kommt noch, daß er versucht, durch die Hardware definierte Bits in einem bestimmten Register zu lesen/zu setzen, so daß sein Programm gar nicht so besonders universell ausgelegt sein muß (in seinem momentan beschriebenen Fall max. 3 unterschiedliche Bits).

@Maik:

Wenn Du evtl. vorhast, Tastenkombinationen zu erfassen: Du kannst das auch abhängig vom jeweilig gewünschten Ergebnis machen. Das soll bedeuten: Du gehst mit Deinem Programm nach dem Schema der wichtigsten Tastenkombinationen vor. Die wichtigste (am meisten benutzte Kombination) mittels entsprechender Bitmaske abfragen, dann die zweitwichtigste usw.

Um eine Reihe von IFs kommst Du dabei so oder so nicht herum, daher kannst Du das auch priorisiert machen und Dir so evtl. mehrere IFs NACH der ersten erkannten Kombination sparen und sofort wieder zur Registerabfrage zurückkehren. Nachteil: Die Laufzeit verändert sich abhängig von der gedrückten Taste/Tastenkombination geringfügig.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 01:09 Uhr

Palgucker
Posts: 1342
Nutzer
Vielleicht noch einen zum Thema "wenn ich jetzt z.B. 34 haben will oder 3456"

Die Bits von rechts nach links von Null an gezählt würde auch mit folgender Variante gehen.

Gebraucht werden von einem 8-Bit Wert z.B. nur die Bits 543. Die oberen (linken) Bits abschneiden mit Wert mod 2 ^ 7 und die unteren Bits dann durch 2 ^ 3 Integerteilung "entfernen".
Würde als Formel etwa so aussehen:

Bitwert=(Wert mod 2 ^ "höchstes benötige Bit + 1")/ 2 ^ "niedrigstes benötigtes Bit"

mfg Palgucker

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 01:10 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Ralf27:
Jetzt mal allgemein: es wäre neu für mich wenn es für den Amiga Joysticks geben würde die mehrere getrennt(!) abfragbare Tasten besitzen würden...


CDTV- und CD32-Joypads zum Beispiel ;)

Abgesehen davon: die rechte Maustaste bspw. hat ebenfalls einen "eigenen" Pin am Joystick-Port (die "mittlere" eigentlich auch? Weiß ich jetzt gar nicht aus dem Stegreif...).

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 12.06.2006 um 01:17 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 10:40 Uhr

MaikG
Posts: 5172
Nutzer
>Moment, meinst du jetzt verschiedene Joysticktasten?

Ja.

> Hm, das wäre mal was neues, wenn es sowas überhaupt gibt.

Die meisten haben mehrere Tasten. Ich hab z.B. ein Atari Joypad(2 Tasten)
und ein Sega Joypad hier(3 Tasten f. Amiga).


>Aber mit Basic kannst du jeweils eine Taste pro Port abfragen.

Ja, ich weiss. Ich gehe aber über die Hardware.



>Jetzt mal allgemein: es wäre neu für mich wenn es für den Amiga
>Joysticks geben würde die mehrere getrennt(!) abfragbare Tasten
>besitzen würden...

Wie Spielst du Turrican? Mit der Leertaste?

Das ist wie Rechte Maustaste und Mittlere Maustaste.


>Hab es eben mehrfach getestet, kein Unterschied. Es wäre auch
>wirklich seltsam gewesen, da ja auch DEZ-Zahlen intern umgewandelt
>werden. Somit es es egal ob der Compiler wärend des compilieren HEX,
>DEZ oder sonstige Formate umwandelt.

Ich mach nachher nochmal ein Speedtest.

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 11:16 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
>Jetzt mal allgemein: es wäre neu für mich wenn es für den Amiga
>Joysticks geben würde die mehrere getrennt(!) abfragbare Tasten
>besitzen würden...

Wie Spielst du Turrican? Mit der Leertaste?

Äh, ja. mit der Leertaste. Hey, da lerne auch ich noch auf meinen alten Tagen was zu Amigajoysticks. :D

Ich dachte wirklich es gäbe nur die mit einer abfragbaren Taste (ok, sind teilweise noch mehr, aber alle hängen zusammen) und die CD32 und CDTV.
Zitat:
Das ist wie Rechte Maustaste und Mittlere Maustaste.
Klingt logisch. Das ganze macht mich jetzt auch sehr neugierig. :D
Zitat:
>Hab es eben mehrfach getestet, kein Unterschied. Es wäre auch
>wirklich seltsam gewesen, da ja auch DEZ-Zahlen intern umgewandelt
>werden. Somit es es egal ob der Compiler wärend des compilieren HEX,
>DEZ oder sonstige Formate umwandelt.

Ich mach nachher nochmal ein Speedtest.


Ja, teste es am besten nochmal. Es gibt nur einen extremen unterschied zwischen variablen und konstanten.
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 12.06.2006 um 11:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 12:12 Uhr

bubblebobble
Posts: 707
Nutzer
Evtl. unterstützt das Maxon Basic ja auch Binärzahlen, so wie z.B. Amiblitz.

Dann könntest du mit

If (a AND %0000000100000000) Then Print "Bit 9 ist gesetzt!"

die einzelenen Bits direkt An/ausschalten in der Binärdarstellung,
dann sparst du dir das ganze 2 hoch ...
Wobei das 2 hoch ... doch schon sehr unschön ist, denn vermutlichwird da mit Floats gerechnet, evtl. geht das dann gar nicht.
Wesentlich effizienter wäre ein Bitschiebe Befehl, z.B.

If (a AND (1 LSL bitN)) Then Print "Bit ",bitN," gesetzt !"

Falls Maxon Basic sowas kann, sollte es aber eigentlich.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 13:25 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von bubblebobble:
Wesentlich effizienter wäre ein Bitschiebe Befehl, z.B.

If (a AND (1 LSL bitN)) Then Print "Bit ",bitN," gesetzt !"

Falls Maxon Basic sowas kann, sollte es aber eigentlich.


ob's effizienter ist will ich bestreiten, aber LSL ist auch nichts anderes als eine Multiplikation mit (2^bitN) oder bei LSR eine division durch (2^bitN).

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 16:05 Uhr

MaikG
Posts: 5172
Nutzer
>Äh, ja. mit der Leertaste. Hey, da lerne auch ich noch auf meinen
>alten Tagen was zu Amigajoysticks. :D

Naja von den Amiga-Joysticks weiss ich auch nicht viel, die
waren nach einer Woche immer schon kaputt. Aber ein Atari-Joypad
hatte ich lange, die Sega-Joypads sind aber noch besser.


>Klingt logisch. Das ganze macht mich jetzt auch sehr neugierig. :D

Du kannst alle 3 Tastenpins auch als als Ausgang nutzen...
Ich wusste mal wie das geht, hoffentlich fällts mir wieder
ein.

>Ja, teste es am besten nochmal. Es gibt nur einen extremen
>unterschied zwischen variablen und konstanten.

Konstanten sind viel schneller?

Okay, ich war da pingelig:

13.49609 HEX
13.46094 DEC

in sekunden bei 1000000 durchläufe.



[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 16:59 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
Naja von den Amiga-Joysticks weiss ich auch nicht viel, die
waren nach einer Woche immer schon kaputt. Aber ein Atari-Joypad
hatte ich lange, die Sega-Joypads sind aber noch besser.

Da hast du aber seltsame Amigajoysticks gehabt. Ich hab hier noch einige, aber vorallem die kleinen halten ewig. Und ich hab diese wirklich teilweise arg zugesetzt. :)
Zitat:
>Ja, teste es am besten nochmal. Es gibt nur einen extremen
>unterschied zwischen variablen und konstanten.

Konstanten sind viel schneller?

Okay, ich war da pingelig:

13.49609 HEX
13.46094 DEC

in sekunden bei 1000000 durchläufe.


Ja, ich bin mir jetzt nicht sicher, aber ca. 10mal schneller (oder gar noch mehr). Allerding sind das nur Konstanten, die man halt nur im Programmcode ändern kann, nicht aber wärend das Programm läuft.

Könntest du mir bitte das betreffende Testprogramm zukommen lassen?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 18:18 Uhr

MaikG
Posts: 5172
Nutzer
>Da hast du aber seltsame Amigajoysticks gehabt. Ich hab hier noch
>einige, aber vorallem die kleinen halten ewig. Und ich hab diese
>wirklich teilweise arg zugesetzt. :)

Bei mir ist immer das Plastik gebrochen was auf diese Gummipads
gedrückt hat.

>Könntest du mir bitte das betreffende Testprogramm zukommen lassen?

Das hab ich noch nicht mal gespeichert, müsste ungefair so gewesen
sein:

t!=timer
for i&=1 to 1000000
if a&=&h499602d2 then
incr bla%
end if
next i&
Print timer-t!

t!=timer
for i&=1 to 1000000
if a&=1234567890 then
incr bla%
endif
next i&
Print timer-t!

wobei a&=0 ist.

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 19:20 Uhr

bubblebobble
Posts: 707
Nutzer
Das Bitshiften ist dahingehend "effizienter", dass es wirklich sicherstellt dass auch das gewünschte passiert.
Der "power" Operator arbeitet nämlich normalerweise mit floats, die dann zurückgewandelt werden müssen. Durch Ungenauigkeit und Rundung (es gibt viele Möglichkeiten das Rundungsbit der FPU zu sezten) kann da schnell mal aus 0x10000 eine 0x0FFFF werden etc., ausserdem ist es wesentlich schneller.
Möglicherweise klappts aber auch immer mit 2^bit, aber ich wollte noch eine alternative auszeigen.
Mit Hilfe von binärzahlen finde ich aber schöner.
Am schönsten wäre natürlich mit Konstanten, die man sich vorher definiert.
Denn wenn es um die Button Abfrage geht, haben die Bits ja sicher eine bedeutung, z.B.

#define BUTTON1_DOWN 1 LSL 8
#define BUTTON2_DOWN 1 LSL 9
...
(kenne jetzt die Maxon Syntax nicht)

und später dann:

If (a AND BUTTON1_DOWN) Then Print "Button1 gedrückt!"

Evtl. gibts im RKM ja bereits die Bitflags.

Aber: Wenn es auch auf non-Classic Rechnern laufen soll, Finger weg von den Hardware Registern!!! Dann sollte alles über IDCMP Messgaes gehen.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 19:22 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
ob's effizienter ist will ich bestreiten, aber LSL ist auch nichts anderes als eine Multiplikation mit (2^bitN) oder bei LSR eine division durch (2^bitN).

Hast Du ein "nicht" vergessen? Shift-Operationen sind deutlich schneller als Multiplikationen und um ein Vielfaches schneller als Divisionen.

An den Stellen, wo Performanceunterschiede wirklich meßbar sind.

Ansonsten gilt wie immer, daß der lesbarere Code der bessere ist. Und wenn man Bit n meint, ist ein shift von 1 um n Bits der besserere Weg.

Zitat:
Original von bubblebobble:
Wesentlich effizienter wäre ein Bitschiebe Befehl, z.B.

If (a AND (1 LSL bitN)) Then Print "Bit ",bitN," gesetzt !"

Falls Maxon Basic sowas kann, sollte es aber eigentlich.


Wenn mich meine Erinnerung nicht trügt, sieht das in MaxonBasic so aus:
basic code:
If (a AND (1 << bitN)) Then Print "Bit ";bitN;" gesetzt !"


mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

12.06.2006, 19:28 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Und jetzt nochmal die HEX-Story:

Hab es eben mehrfach getestet, kein Unterschied. Es wäre auch wirklich seltsam gewesen, da ja auch DEZ-Zahlen intern umgewandelt werden. Somit es es egal ob der Compiler wärend des compilieren HEX, DEZ oder sonstige Formate umwandelt.


Es wäre auch insofern seltsam, weil gerade für den Computer Hexdezimalzahlen leichter zu lesen sind. Zumindest wenn man bei der Compilerentwicklung nicht kompletten Unsinn anstellt.

Und selbst in einem Interpreter sollten Konstanten maximal einmal geparst werden.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Bit von Word extrahieren [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.