![]() |
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: 7719 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: Ö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 -- --- ![]() ![]() [ - 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: 7719 Nutzer |
@MaikG:Zitat: 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: 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: Du schreibst ne Menge: Zitat: Zitat: 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: 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: 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: 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: 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: Nein, ich meine, weil Du schriebst: Zitat: 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-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |