nochma Bitrotation (und Strings)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
YoshiGreen
Beiträge: 11
Registriert: 08.09.2004 12:59
Wohnort: Layer 12
Kontaktdaten:

nochma Bitrotation (und Strings)

Beitrag 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:
Zuletzt geändert von YoshiGreen am 08.09.2004 13:48, insgesamt 1-mal geändert.
Kristel
Beiträge: 72
Registriert: 30.08.2004 00:17

Re: nochma Bitroation (und Strings)

Beitrag 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.
Benutzeravatar
SäsH
Beiträge: 8
Registriert: 01.09.2004 02:53
Wohnort: Nähe Stuggi

Beitrag 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.... :)
Der Mensch kann zwar tun was er will, aber nicht wollen was er will.
Dieser Umstand bewahrt mich davor die Handlungen meiner Mitmenschen allzuernst zu nehmen, und den guten Humor zu verlieren.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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...^^
Benutzeravatar
YoshiGreen
Beiträge: 11
Registriert: 08.09.2004 12:59
Wohnort: Layer 12
Kontaktdaten:

Beitrag 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
No matter where you are, everyone is always connected!
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.^^
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Re: nochma Bitrotation (und Strings)

Beitrag 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.
horst
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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?
Zuletzt geändert von Ynnus am 09.09.2004 00:24, insgesamt 1-mal geändert.
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

$FFFFFC0 - $FFFF00 = $C0 :mrgreen:
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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?
Antworten