Seite 1 von 3

nochma Bitrotation (und Strings)

Verfasst: 08.09.2004 13:03
von YoshiGreen
Hiho, da ich irgendwie nicht mitbekommen hab, dass das Board neu aufgesetzt wurde stelle ich einfach hier nochma meine Frage:
Meine Frage:
Hiho,

ich wollte mal fragen, wie man ne Bitrotation durchführen kann. Inner Hilfe steht ja, wie man shiftet, aber rotieren -> nix ;_;

Jemand ne Ahnung?!

Yoshi
Antwort von Horst

Mit Assembler ganz einfach:

x = 123
ROR dword[v_x],3 ; rotate right 3 bits
ROL dword[v_x],3 ; rotate left 3 bits

Sonst musst du (mit shift) das rausfallende Bit vorher
abfragen und dann wieder reintüteln..
Öhm ja.... könnte man das vielleicht in nem netten PB Code verpacken *lieb guck* weilso versteh ich ehrlich gesacht gar nichts ;_;

Außerdem wollte ich noch fragen, ob es ne Möglichkeit gibt einen String in seine Zeichen zu zerlegen und die in Arrays zu speichern...
Hab das ma mti Asc() probiert, aba wie krieg ich dann das erste Zeichen aus String wech?! :cry:

Re: nochma Bitroation (und Strings)

Verfasst: 08.09.2004 13:23
von Kristel
YoshiGreen hat geschrieben:Außerdem wollte ich noch fragen, ob es ne Möglichkeit gibt einen String in seine Zeichen zu zerlegen und die in Arrays zu speichern...
Hoffe ich habe deine Frage richtig verstanden.

Code: Alles auswählen

String.s = "Test"
Zeichenanzahl.l = Len(String)
Dim Stringzeichen.s(Zeichenanzahl)
For x = 1 To Zeichenanzahl
  Stringzeichen(x) = Mid(String,x,1)
Next
For x = 1 To Zeichenanzahl
  Debug Stringzeichen(x)
Next
Mit der Code speichert jedes Zeichen des Strings in ein Feld des Arrays.

Verfasst: 08.09.2004 14:44
von SäsH
also z.b. 8bit um 3 stellen nach links rotieren:

a.b=%11101010

zuerst so rotieren das nur noch die bits, die rausfallen würden da sind. (und merken in buffer.b)
um 8-3 stellen nach rechts ergibt:

buffer.b=a.b>>(8-3) ; buffer.b = %00000111

dann a um 3 stellen links rotieren:

a.b=a.b<<3 ; a.b = %01010000

und jetzt die beiden oder verknüpfen (kann auch anders verknüpft werden, oder ist aber das einfachste)

a.b=a.b | buffer.b ; a.b = %01010111

ich hoff es war verständlich..... aber der asm-code oben ist definitiv schneller/kürzer und einfacher.... :)

Verfasst: 08.09.2004 15:58
von Ynnus
@ Yoshi: hähä, das ist für den Contest im Ring, oder?^^ Ich hab das auch nicht so recht verstanden bzw. ist mir diese Thematik zu dumm für einen Contest, daher mach ich da erst garnicht mit...^^

Verfasst: 08.09.2004 17:35
von YoshiGreen
@Kristel: Super, genial, genauso *knutsch* :D

@SäsH: öhm, dass schau ich mir nochma in Ruhe, k?! ;)

@Sunny: Verdammt du bist ja auch noch da :) Ja ist es ^^ Aber warum nicht verstanden, Luki hat doch alles erklärt oO

Verfasst: 08.09.2004 17:44
von Ynnus
Naja, ich habs mir mal angesehen und habs so gemacht, XOR und Bitrotation, komme aber auf andere Werte als die anderen... Naja, komisch.^^

Re: nochma Bitrotation (und Strings)

Verfasst: 08.09.2004 19:43
von horst
YoshiGreen hat geschrieben: Öhm ja.... könnte man das vielleicht in nem netten PB Code verpacken *lieb guck* weilso versteh ich ehrlich gesacht gar nichts ;_;
Einfach z.B. "ROL variable,AnzahlBits" schreiben.
Hier zum Testen (ASM Unterstützung einschalten):

Code: Alles auswählen

x = 1234567
Debug RSet(Bin(x),32,"0") + " Original 1234567"

ROR x,3
Debug RSet(Bin(x),32,"0") + " 3 Bits nach rechts"

ROL x,3
Debug RSet(Bin(x),32,"0") + " 3 Bits nach links"
Wenn du um eine variable Anzahl Bits verschieben willst, schreib nochmal.

Verfasst: 09.09.2004 00:06
von Ynnus
Dann hab ich zum Theme gerade noch ne Frage:

Gibt es eine Möglichkeit, aus einem Hexadezimalwert die "F" zu Beginn entfallen zu lassen?

Also aus $FFFFFC0 soll $C0 werden, und wieder in einer Variable gespeichert werden, nicht in einem String.
Oder FFFFFFD2 zu D2... Da liegt derzeit mein Problem, da so riesige Werte in Form einer Byte-Variable zu einem negativen Wert gewandelt werden (da ja nur 7 byte genutzt werden dürfen in PB-Byte-Variablen).
Der Wert wäre aber nur ohne die "F" davor korrekt. Kann man die irgendwie wegfallen lassen?

Verfasst: 09.09.2004 00:12
von SoS
$FFFFFC0 - $FFFF00 = $C0 :mrgreen:

Verfasst: 09.09.2004 00:27
von Ynnus
Ja, sicher, aber leider muss es pauschal sein. Ich hab manche Hex-Werte in 2-Stelligen Werten wie C2 und manche mit "F" davor. Gibts da eine pauschale Lösung?