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

amiga-news.de Forum > Programmierung > Zahl per Shiften umkehren [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

11.01.2007, 13:06 Uhr

MaikG
Posts: 5172
Nutzer
Ich hab eine zahl z.b.

0x123456

und muss daraus

0x563412

machen.

Ich habs mit einem Word auf anhieb geschaft
num1%=&h1234
Print hex$((num1% << 8)+ (num1% >> 8))

Obwohl Shiften nicht mein ding ist, aber irgendwie wills
nicht mit der 24 Bit Zahl...

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 13:30 Uhr

thomas
Posts: 7716
Nutzer

(num >> 16) + (num BITAND &h00ff00) + ((num BITAND &h0000ff) << 16)

Ich weiß nicht, ob es BITAND in Basic gibt. Gemeint ist das bitweise & in C, im Gegensatz zum logischen && (AND in Basic).

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 13:46 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von MaikG:

Obwohl Shiften nicht mein ding ist, aber irgendwie wills
nicht mit der 24 Bit Zahl...


Öhm.... *hust*....

0x1234 ist 16bit. Bei einem Shift mit Roll-Around vertauschst Du da effektiv die beiden Bytes. (Ohne Roll-Around käme 0x3400 bzw. 0x0012 dabei raus.)

Zum einen ist jetzt aber 0x123456 eine 24bit-Zahl, und m.E. ist Shift nur über 16bit und 32bit überhaupt definiert. Zum zweiten willst Du ja eben nicht shiften, sondern das "mittlere" Byte "beibehalten".

Da stellt sich schon die Frage nach dem "warum", denn so wie von Dir gefragt wissen wir nicht, ob Du 0x00123456 oder 0x12345600 meinst, ob Du das "mittlere" Byte tatsächlich beibehalten willst oder das schon ein Denkfehler Deinerseits ist, ob Du vielleicht bigendian / lowendian konvertieren willst oder oder....

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 16:37 Uhr

whose
Posts: 2156
Nutzer
@Solar:

Ich tippe mal auf RGB<>BGR-Konvertierung ;)

Grüße

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 16:44 Uhr

MaikG
Posts: 5172
Nutzer
>(num >> 16) + (num BITAND &h00ff00) + ((num BITAND &h0000ff) << 16)

>Ich weiß nicht, ob es BITAND in Basic gibt. Gemeint ist das
>bitweise & in C, im Gegensatz zum logischen && (AND in Basic).

BitAnd gibt es leider nicht.

>0x1234 ist 16bit. Bei einem Shift mit Roll-Around vertauschst
>Du da effektiv die beiden Bytes. (Ohne Roll-Around käme 0x3400 bzw.
>0x0012 dabei raus.)

Nicht das ich das jetzt vollständig verstehe, aber es kommt bei
Word das raus was ich benötige.


>Zum einen ist jetzt aber 0x123456 eine 24bit-Zahl, und m.E. ist
>Shift nur über 16bit und 32bit überhaupt definiert.
>Zum zweiten willst Du ja eben nicht shiften, sondern das "mittlere"
>Byte "beibehalten".

Ja, das liegt so vor:

332211 und die richige Reihenfolge ist 112233. Zufällig bleibt
da in der mitte gleich.

>Da stellt sich schon die Frage nach dem "warum", denn so wie von Dir
>gefragt wissen wir nicht, ob Du 0x00123456 oder 0x12345600 meinst,
>ob Du das "mittlere" Byte tatsächlich beibehalten willst oder das
>schon ein Denkfehler Deinerseits ist, ob Du vielleicht
>bigendian / lowendian konvertieren willst oder oder....

0x12345600, das 00 ist aber unbenutzt.

Ja, das mit dem Endian? weiss ich nicht. Die Daten sind ebend verkehrt
herum, erst der High Teil dann der Low Teil.

>Ich tippe mal auf RGB<>BGR-Konvertierung

Nein, was mit Writepixelarray und dieses Zeugs hab ich noch nicht
gemacht.

[ Dieser Beitrag wurde von MaikG am 11.01.2007 um 16:47 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 16:50 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Zitat:
0x12345600, das 00 ist aber unbenutzt.

Das solltest du dir aber schon genau überlegen.

0x112233 ist das gleiche wie 0x00112233 (führende Nullen zählen nicht, wie in der Mathematik üblich). Wenn du daraus 0x332211 haben möchtest, dann ist das gleich 0x00332211. 0x33221100 ist etwas ganz anderes (Nullen am Ende zählen sehr wohl !)

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 16:55 Uhr

MaikG
Posts: 5172
Nutzer
>Wenn du daraus 0x332211 haben möchtest, dann ist das gleich
>0x00332211. 0x33221100 ist etwas ganz anderes (Nullen am Ende
>zählen sehr wohl !)

Also wenn man das auf ein Long(32 Bit) bezieht muss aus

0x44332211

0x11223344

werden.

[ Dieser Beitrag wurde von MaikG am 11.01.2007 um 16:55 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 16:58 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von MaikG:

>0x1234 ist 16bit. Bei einem Shift mit Roll-Around vertauschst
>Du da effektiv die beiden Bytes. (Ohne Roll-Around käme 0x3400 bzw.
>0x0012 dabei raus.)

Nicht das ich das jetzt vollständig verstehe, aber es kommt bei
Word das raus was ich benötige.


0x1234 ist binär "0001 0010 0011 0100".

Ein Shift heißt, daß die Bits um eins nach links oder rechts versetzt werden.

Ein "Shift mit Roll-Around" heißt, das das links oder rechts "rausgeshiftete" Bit auf der anderen Seite wieder eingefügt wird.

Ein "Shift ohne Roll-Around" heißt, das "rausgeshiftete" Bits verloren sind und mit Nullen aufgefüllt werden. Nach 16 Shifts in eine Richtung hättest Du eine glatte Null.

Das Problem ist jetzt, daß nicht ganz sicher zu sein scheint, wie Dein 24bit-Wert im 32bit-Langwort genau positioniert ist. Da ein Shift aber eben nicht auf 24 Bit funktioniert, sondern nur auf 16 oder 32 Bit, muß das erst 100%ig geklärt werden, sonst kommt beim Shiften Müll raus.

[ - Antworten - Zitieren - Direktlink - ]

11.01.2007, 17:12 Uhr

MaikG
Posts: 5172
Nutzer
>Das Problem ist jetzt, daß nicht ganz sicher zu sein scheint,
>wie Dein 24bit-Wert im 32bit-Langwort genau positioniert ist.

Doch schreib ich doch oben.


>Da ein Shift aber eben nicht auf 24 Bit funktioniert, sondern nur
>auf 16 oder 32 Bit, muß das erst 100%ig geklärt werden, sonst kommt
>beim Shiften Müll raus.

Also müsste ich die 32 Bit zahl nehmen davon jeweils 16 Bit
nach links und nach rechts shiften, dann diese 16 Bit zahlen nochmal
wie das Word shiften oder?

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 00:13 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
>Das Problem ist jetzt, daß nicht ganz sicher zu sein scheint,
>wie Dein 24bit-Wert im 32bit-Langwort genau positioniert ist.

Doch schreib ich doch oben.


Du schreibst ne Menge:
Zitat:
Original von MaikG:
Also wenn man das auf ein Long(32 Bit) bezieht muss aus

0x44332211

0x11223344

werden.


Zitat:
Vom gleichen Autor, nur etwas früher:
Ja, das liegt so vor:

332211 und die richige Reihenfolge ist 112233. Zufällig bleibt
da in der mitte gleich.


Also offenbar weißt Du selber nicht, was Du nun willst.

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

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 09:27 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von MaikG:

Also müsste ich die 32 Bit zahl nehmen davon jeweils 16 Bit
nach links und nach rechts shiften, dann diese 16 Bit zahlen nochmal
wie das Word shiften oder?


Huh?

Lies Dir den Satz doch noch einmal selber durch, quasi durch unsere Augen. Wirst Du selbst daraus schlau?

Eben, wir auch nicht.

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 09:45 Uhr

DrNOP
Posts: 4118
Nutzer
Ich denke, für dein Problem hilft dir die Doku und besser noch der Quellcode der Makros NTOHL (Net to host long = dreht die Byteorder um) und NTOHS (Net to host short) in C weiter. Ich hab' auf die Schnelle leider nicht viel gefunden.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 10:34 Uhr

MaikG
Posts: 5172
Nutzer
@Solar unke nicht, ich habs gestern fast hinbekommen:

code:
num&=&h56341200

num1&=(num&<<16)>>24 REM 12
num2&=(num&<<8)>>24 REM 34
num3&=num&>>24 REM 56

PRINT HEX$(num1&)+HEX$(num2&)+HEX$(num3&)


Jetzt muss man nur noch num1 und num 2 ein paar nullen anhängen(*)
und dann müsste es gehen.

Ich hab aber gestern/heute noch eine bessere methode aufs Papier
gebracht wo die Nullen "erhalten" bleiben - muss ich noch ausprobieren.


[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 11:29 Uhr

DrNOP
Posts: 4118
Nutzer
Nur der Vollständigkeit halber:

Ich hab's noch gefunden
code:
#define ntohl(x)	((((x) & 0x000000ff) << 24) | 
			 (((x) & 0x0000ff00) <<  8) | 
			 (((x) & 0x00ff0000) >>  8) | 
			 (((x) & 0xff000000) >> 24))


Dreht die Bytes astrein um und dürfte das sein was du suchst, oder?
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 11:38 Uhr

MaikG
Posts: 5172
Nutzer
>Dreht die Bytes astrein um und dürfte das sein was du suchst, oder?

Ja, optisch gesehen dürfte das auch gehen, ich habs jetzt so:

code:
swap3&=(((num&<<16)>>8)+(((num&<<8)>>24)<<8)+(num&>>24))


Ich glaub jetzt hab ich das Shifen begriffen. Muss es mir nur
noch aufschreiben damit ichs nicht vergesse.

Danke @all

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 12:40 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von MaikG:

Ich glaub jetzt hab ich das Shifen begriffen.


Dann versuch es nicht häufiger einzusetzen als Du mußt, denn als naher Verwandter der Multiplikation ist es eine recht kostspielige Angelegenheit. (DrNOP's Makro macht ein viertel weniger Shifts...)

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 13:25 Uhr

Der_Wanderer
Posts: 1229
Nutzer
??? Shiften ist das "billigste" was man machen kann, auf einer Ebene mit ausmaskieren oder "Or"en. Besser als Multiplizieren oder gar Dividieren.




--
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.01.2007, 14:25 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Der_Wanderer:
??? Shiften ist das "billigste" was man machen kann, auf einer Ebene mit ausmaskieren oder "Or"en.


Sorry, Hirn auf Urlaub. Natürlich ist ein "Roll" weitaus günstiger als eine Multiplikation.

Vergeßt den Vogel, folgt dem Fluß.

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 15:08 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
DrNOP's Makro macht ein viertel weniger Shifts...


Sein Makro macht auch etwas völlig anderes, präziser gesagt, es erfüllt eine klare Aufgabe. Maik's Code dagegen macht irgendeine Mischung aus seinen verschiedenen, völlig widersprüchlichen Aufgabenstellungen, erfüllt aber keine davon wirklich.

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

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 18:24 Uhr

MaikG
Posts: 5172
Nutzer
>Maik's Code dagegen macht irgendeine Mischung aus seinen
>verschiedenen, völlig widersprüchlichen Aufgabenstellungen,
>erfüllt aber keine davon wirklich.

Stimmt so nicht, du meinst weil ich die 4.Stelle ignoriere.
Ich habe die 4. Stelle nur hingeschrieben weil danach gefragt
wurde, benötigt wird sie nicht und wenn da was anderes als 00
ist ist's ergebniss falsch.

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 18:53 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Stimmt so nicht, du meinst weil ich die 4.Stelle ignoriere.


Nein, ich meine, weil Du schriebst:
Zitat:
Original von MaikG:
code:
swap3&=(((num&<<16)>>8)+(((num&<<8)>>24)<<8)+(num&>>24))



Das heißt, wenn Du ein int mit der byte-Folge a b c d hast, wird daraus nach Deiner Transformation 0 c (b+d) a. Was auch immer Du eigentlich vorhattest, so richtig verstanden hat es hier ja eh keiner. Dein code macht jedenfalls nur dann Sinn, wenn Du nur b und c vertauschen wolltest, und a und d immer 0 sind, zumindest wenn es immer noch so eine Art Vertauschung sein soll. Das hättest Du aber wesentlich einfacher haben können.

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

[ - Antworten - Zitieren - Direktlink - ]

12.01.2007, 19:06 Uhr

MaikG
Posts: 5172
Nutzer
>Das heißt, wenn Du ein int mit der byte-Folge a b c d hast, wird
>daraus nach Deiner Transformation 0 c (b+d) a. Was auch immer Du
>eigentlich vorhattest, so richtig verstanden hat es hier ja eh
>keiner. Dein code macht jedenfalls nur dann Sinn, wenn Du nur b und
>c vertauschen wolltest, und a und d immer 0 sind, zumindest wenn es
>immer noch so eine Art Vertauschung sein soll. Das hättest Du aber
>wesentlich einfacher haben können.


der code macht aus abcd, 0cba - d ist beim Eingang immer 0.
int ist maximal FFFF, & bedeutet Long bei Basic.

Ich hab mehrere Testreihen mit diversten Zahlen durchgeführt,
es geht.

[ - Antworten - Zitieren - Direktlink - ]

13.01.2007, 17:58 Uhr

MaikG
Posts: 5172
Nutzer
so ist's dann für eine vollständige Long:

swap4&=(num&<<24)+(((num&<<16)>>24)<<16)+(((num&<<8)>>24)<<8)+(num&>>24)

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Zahl per Shiften umkehren [ - Suche - Neue Beiträge - Registrieren - Login - ]


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