DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Zahl per Shiften umkehren | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2007-01-11, 13:06 h MaikG Posts: 5172 User |
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... [ - Answer - Quote - Direct link - ] |
2007-01-11, 13:30 h thomas Posts: 7718 User |
(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/ [ - Answer - Quote - Direct link - ] |
2007-01-11, 13:46 h Solar Posts: 3680 User |
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.... [ - Answer - Quote - Direct link - ] |
2007-01-11, 16:37 h whose Posts: 2156 User |
@Solar: Ich tippe mal auf RGB<>BGR-Konvertierung Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Answer - Quote - Direct link - ] |
2007-01-11, 16:44 h MaikG Posts: 5172 User |
>(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. ] [ - Answer - Quote - Direct link - ] |
2007-01-11, 16:50 h thomas Posts: 7718 User |
@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/ [ - Answer - Quote - Direct link - ] |
2007-01-11, 16:55 h MaikG Posts: 5172 User |
>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. ] [ - Answer - Quote - Direct link - ] |
2007-01-11, 16:58 h Solar Posts: 3680 User |
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. [ - Answer - Quote - Direct link - ] |
2007-01-11, 17:12 h MaikG Posts: 5172 User |
>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? [ - Answer - Quote - Direct link - ] |
2007-01-12, 00:13 h Holger Posts: 8116 User |
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. [ - Answer - Quote - Direct link - ] |
2007-01-12, 09:27 h Solar Posts: 3680 User |
Zitat: Huh? Lies Dir den Satz doch noch einmal selber durch, quasi durch unsere Augen. Wirst Du selbst daraus schlau? Eben, wir auch nicht. [ - Answer - Quote - Direct link - ] |
2007-01-12, 09:45 h DrNOP Posts: 4118 User |
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 [ - Answer - Quote - Direct link - ] |
2007-01-12, 10:34 h MaikG Posts: 5172 User |
@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. [ - Answer - Quote - Direct link - ] |
2007-01-12, 11:29 h DrNOP Posts: 4118 User |
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 [ - Answer - Quote - Direct link - ] |
2007-01-12, 11:38 h MaikG Posts: 5172 User |
>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 [ - Answer - Quote - Direct link - ] |
2007-01-12, 12:40 h Solar Posts: 3680 User |
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...) [ - Answer - Quote - Direct link - ] |
2007-01-12, 13:25 h Der_Wanderer Posts: 1229 User |
??? 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 [ - Answer - Quote - Direct link - ] |
2007-01-12, 14:25 h Solar Posts: 3680 User |
Zitat: Sorry, Hirn auf Urlaub. Natürlich ist ein "Roll" weitaus günstiger als eine Multiplikation. Vergeßt den Vogel, folgt dem Fluß. [ - Answer - Quote - Direct link - ] |
2007-01-12, 15:08 h Holger Posts: 8116 User |
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. [ - Answer - Quote - Direct link - ] |
2007-01-12, 18:24 h MaikG Posts: 5172 User |
>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. [ - Answer - Quote - Direct link - ] |
2007-01-12, 18:53 h Holger Posts: 8116 User |
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. [ - Answer - Quote - Direct link - ] |
2007-01-12, 19:06 h MaikG Posts: 5172 User |
>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. [ - Answer - Quote - Direct link - ] |
2007-01-13, 17:58 h MaikG Posts: 5172 User |
so ist's dann für eine vollständige Long: swap4&=(num&<<24)+(((num&<<16)>>24)<<16)+(((num&<<8)>>24)<<8)+(num&>>24) [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Zahl per Shiften umkehren | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |