Eigenartige Funktionen
Übersicht

HeikoBetreff: Eigenartige Funktionen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kann mir jemand ein wenig beim Aufschlüsseln dieser Funktionen helfen?
Code: [AUSKLAPPEN] FUNCTION Swap32%(Value%) LOCAL b1 = Value AND 255 LOCAL b2 = (Value Shr 8) AND 255 LOCAL b3 = (Value Shr 16) AND 255 LOCAL b4 = (Value Shr 24) AND 255 b1 = b1 Shl 24 b2 = b2 Shl 16 b3 = b3 Shl 8 RETURN b1 OR b2 OR b3 OR b4 END FUNCTION FUNCTION xLoadAnimImageEx% ( fileName$, textureFlags%, frameWidth%, frameHeight%, firstFrame%, frameCount%, imageFlags%=FI_AUTOFLAGS ) textureFlags = (textureFlags AND $3F) OR $9 RETURN xCreateImageEx ( xLoadAnimTexture (fileName, textureFlags, frameWidth, frameHeight, firstFrame, frameCount), frameWidth, frameHeight, imageFlags) END FUNCTION Also wie so eine Funktion grundlegend funktioniert ist klar, weiß ich auch. Allerdings sehe ich bei den übergebenen Parametern absolut net durch. Also hier z.b. Code: [AUSKLAPPEN] FUNCTION Swap32%(Value%)
LOCAL b1 = Value AND 255 LOCAL b2 = (Value Shr 8) AND 255 LOCAL b3 = (Value Shr 16) AND 255 LOCAL b4 = (Value Shr 24) AND 255 b1 = b1 Shl 24 b2 = b2 Shl 16 b3 = b3 Shl 8 RETURN b1 OR b2 OR b3 OR b4 END FUNCTION An Funktion Swap32 wird ein Integer Wert übergeben und bekommt einen zurück.soweit klar. Aber ich versteh nicht, wie oder wonach entschieden wird, was bei RETURN zurückgegeben wird. Und bei der anderen Funktion, weiß ich nicht so wirklich was hiermit anzufangen Code: [AUSKLAPPEN] textureFlags = (textureFlags AND $3F) OR $9
also $3F) OR $9............. achja und noch eine total wichtige Frage, kann man das verschieben der Bits mittels Shr auch anders lösen, also ohne Shr? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Im grunde wird der eingegebene Parameter in 4 Bytes aufgeteilt und dann über eine Or![]() Code: [AUSKLAPPEN] 00000001
00000010 00001101 11100111 ------------ 11101111 = 239 dec |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
soweit hab ich das verstanden, aber kann man diese verschiebung mittels Shr auch mathematisch anders lösen?
Also die Funktion anders berechnen lassen, aber mit gleicher Funktionsweise. Hab irgendwo gelesen, dass Shr nur einfach schneller sein soll, mehr nicht. Ist Code: [AUSKLAPPEN] zahl Shr bits tatsächlich zahl/2 ?
weil in der hilfe steht ja dass die bits die "hinten rauskommen" abgeschnitten werden. |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi
dass die bits die "hinten raus kommen" abgeschnitten werden bewirkt nur dass die zahl abgerundet wird wenn sie keine ganze zahl ist. Und ja man kann das mathematisch anders lösen: Code: [AUSKLAPPEN] zahl Shr bits
ist wenn ich mich nicht irre das gleiche wie: Code: [AUSKLAPPEN] zahl * 2 ^ bits
das heißt Code: [AUSKLAPPEN] zahl Shr -1 halbiert die zahl,
Code: [AUSKLAPPEN] zahl Shr 0 lässt die zahl wie ist,
Code: [AUSKLAPPEN] zahl Shr 1 verdoppelt sie,
Code: [AUSKLAPPEN] zahl Shr 2 vervierfacht sie usw.
|
||
1 ist ungefähr 3 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
es gibt keinen grund shl und shr zu ersetzen durch die mathematischen operationen. shl / shr sind schneller | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da liegst Du volkommen falsch, Wurgel. SHR verschiebt bitweise nach rechts, d.h. es halbiert die Zahl bitweise.
Beispiel: 7 dezimal = %111 binär 7 shr 1 (also um eine Stelle nach rechts verschoben): %11 binär (eine eins fällt weg) -> 3 dezimal. Es wird also die Zahl halbiert und ein eventueller Rest verworfen. SHL verschiebt bitweise nach links: 7 dezimal ist immer noch %111 binär 7 shl 1 -> %1110 (es wird immer mit Nullen aufgefüllt) = 14 dezimal. Die Zahl wird also verdoppelt. Die Funktion nach der Heiko fragt tut nichts anderes als die vier Byte eines Integers in ihrer Reihenfolge zu vertauschen (was der Name der Funktion, swap, ja auch schon zum Ausdruck bringt). Also wird aus $01020304 ein $04030201 gemacht (das $ steht für Hexadezimal, also für Zahlen mit der Basis 16.) Dazu werden zuerst die einzelnen Bytes des Integers isoliert: LOCAL b3 = (Value Shr 16) AND 255 beispielsweise macht bei $01020304 folgendes: $01020304 shr 16 :verschiebe um 16 bit (also 2 byte) nach rechts: -> $00000102 AND 255 :maskiert das unterste Byte. And operiert bitweise und wird nur 1 wenn beide Bits 1 sind, also wird aus : $0102 = %00000001 00000010 and $ff = 255 = %11111111 ein fröhliches: %00000000 00000010 . Das And lässt also nur das $02 übrig, das byte ist also isoliert. Bei den anderen Bytes wird entsprechend verfahren. Nachdem das geschehen ist werden die Bytes entsprechend ihrer neuen Position mit SHL verschoben, d.h. das byte das später als erstes steht wird um 24 bit nach links geschoben, das daneben um 16 u.s.w. Dann wird von der Funktion als Rückgabewert der zusammengesetzte Integer zurückgegeben. OR gibt nicht einen der Werte zurück, wie man meinen könnte, sondern es ist ein bitweises oder. Im gegnesatz zu AND ist bei OR ein Bit eins wenn eins der zugrundeliegenden bits eins ist. In unserem Beispiel also: $04000000 or $030000 or $0200 or $01 binär: 00000100 000000000 00000000 00000000 or 00000000 000000011 00000000 00000000 or 00000000 000000000 00000010 00000000 or 00000000 000000000 00000000 00000001 __________________________________ 00000100 000000011 00000010 00000001 Was dann also $04030201 wäre. Der Integer ist vertauscht, Mission accomplished. Ich hoffe das half ein wenig. Um das alles zu verstehen ist es sinnvoll sich mit Binär- und Hexadezimalsystem auseinanderzusetzen. Mit beiden lässt sich rechnen wie mit unserem Dezimalsystem, Du hast eben nur eine andere Basis an der der Umbruch auf die jeweils nächste Stelle geschieht. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn man also das SHR als seperate Funktion schreiben würde wollen, was müsste man da machen?
Also Code: [AUSKLAPPEN] Function Shr
"was müsste hier rein?" End Function würde mich mal interessieren. hab hier einen kleinen code, der konvertiert werden müsste, mir fehlt nur ein ersatz für shr... |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das wurde doch schon oben genannt?!
Code: [AUSKLAPPEN] vorgabe=1234
For q=0 To 15 wert1=vorgabe Shr q wert2=Floor(vorgabe / 2^q) Print wert1+" - "+wert2 Next WaitKey End |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
oh sorry, war mir eben jetzt nicht 100% sicher, hatte es überflogen, da ich grad verwandtschaft da habe.
danke dir. geht das mit SHL genauso einfach????? ich hatte ja oben nochwas gefragt, und zwar ging es da um Code: [AUSKLAPPEN] textureFlags = (textureFlags AND $3F) OR $9 mit geht es um die zeichen, die mit $ angeführt werden.
wenn ich jetzt als textureflag eine zahl stehen habe, wird das dann einfach dahinter geschrieben, oder wie muss ich das verstehen? vorallem, wieder so ein OR, ohne dass man weiß, warum OR. also zusammengefasst: 1. Frage: Wie würde die Funktion mit SHR aussehen? 2. Frage: Code: [AUSKLAPPEN] textureFlags = (textureFlags AND $3F) OR $9 mit geht es um die zeichen, die mit $ angeführt werden.
wenn ich jetzt als textureflag eine zahl stehen habe, wird das dann einfach dahinter geschrieben, oder wie muss ich das verstehen? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zu 1) Ich denke nicht das es sinnvoll möglich sei, das ganze in dieser Beziehung über shl erledigen zu können. Eventuell möglich mit ewigem rumgeeiere und verschieben und addieren einzelner Werte, was dann wirklich das schlechteste Programmierbeispiel wäre, was mir bisher je unter die Augen fallen würde.
Zu 2) Das (textureFlags AND $3F) ergibt, dass die letzten 6 Bits - da $3F = 63 dec bzw. 00111111 bin ist - ausgefiltert werden. Das heisst, alle vorherigen Bits werden ignoriert/terminiert. Das (wert) OR $9 setzt wiederrum $9 = 9 dec = 00001001 bin die entsprechenden Bits wieder ein, egal ob nun im wert die Bits gesetzt waren oder nicht. Man darf nicht vergessen, dass And ![]() ![]() ![]() ![]() ![]() Code: [AUSKLAPPEN] Local IFR1Abs%=((FFarbe And %11000000000000000000000000000000) Shr 30)*85
Local IFG1Abs%=((FFarbe And %00110000000000000000000000000000) Shr 28)*85 Local IFB1Abs%=((FFarbe And %00001100000000000000000000000000) Shr 26)*85 Local IFA1Abs#=((FFarbe And %00000011000000000000000000000000) Shr 24)/3.0 ... ... Hier wird ein aus einer Datei eingelesenes komprimierte Byte in einzelne Farbwerte aufgeteilt. Somit kann man für jeden Teilbereich als 4 Farbstuben pro Farbkanal (RGBA) in ein Byte abspeichern. Ein Integer beinhaltet dann also 4 Teilbereiche (in meinem Fall ein Quad mit vier Eckpunkten) mit jeweils 4 Farbstufen pro Farbkanal wovon es 4 - also Rot, Grün, Blau und Alpha - gibt. Die Farbwerte werden auch gleich raufskalliert: 0*85=0, 1*85=85, 2*85=170 und 3*85=255 und für Alphe eben /3 da Alpha nur bis 1 geht. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
muss man das mit den $ machen, kann man nicht einfach die dezimalzahl nehmen? oder muss man das nehmen weil ja ein AND dort steht, und es um bitoperationen geht. theoretisch könnte ich das ja auch gleich als binärcode machen, smile.
diese beiden sachen, also das mit shr und shl, und das untere mit $3F ect. , kann man das auch anders machen? ohne shr und shl benutzen zu müssen? sowie das texturflag anders errechnen lassen? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann es sein, dass du garnicht versucht zu verstehen was dir all die Leute erklären?
Wenn du uns genau sagst weshalb du unbedingt auf SHR und SHL verzichten willst/musst, dann könnte man eventuell schneller eine Lösung zu finden. Ein Ersatz für SHR und SHL sieht in etwa so aus: Code: [AUSKLAPPEN] vorgabe=1234
For q=0 To 9 wert1=vorgabe Shr q wert2=Floor(vorgabe / 2^q) Print wert1+" - "+wert2 Next Print "----" For q=0 To 9 wert1=vorgabe Shl q wert2=vorgabe * 2^q Print wert1+" - "+wert2 Next WaitKey End Wie aber Dreamora schon sagte, gibt es keinen Grund auf diese zu verzichten, da diese Befehle am schnellsten sind, weil die Befehle so funktionieren wie ein Computer eben rechnet. Im BB-Code kannst du natürlich auch direkt eine Dezimalzahl eintragen, dann muß aber auch ein vorgestelltes $ oder % weg genommen werden. Das heisst: $F = 15 = %1111, die Werte werden eben vom Precompiler im vorwege geändert, somit ergibt es keinen Unterschied später im Programm selbst. Um AND, OR, XOR oder NOT komplett zu umgehen, müsste man schon etwas mehr Codezeilen zu schreiben. Denn es handelt sich um Bitoperatoren und dann gilt es eben diese aufzuteilen und die logische Verknüpfung zu machen. Das heisst: Jede Zahl muß zuerst in Bits aufgeteilt werden und dann jeweils einzelnd mit If-Abfrage logisch und manuell verknüpft werden. Am Ende muß dann wieder alles zusammengerechnet werden. Da von rechts aus gesehen jedes Bit jeweils 2^(Stelle-1) bedeutet, muß eben danach geprüft werden. Da aber der Wertebereich so nicht aufgeteilt werden kann, muß von links aus gestartet werden und bei einem geprüften TRUE der Wert von der Summe abgezogen werden. Ein Beispielcode ohne Vorzeichen (nur positive Zahlen), nur Ganzzahlen (kein Komma) und einem Variablenbereich von 0 bis 2147483647 und ganz ohne Bitoperatoren: Code: [AUSKLAPPEN] Graphics 800,600,0,2
SetBuffer BackBuffer() Local Q,Wert,Zahl=1234 For Q=30 To 0 Step-1 Wert=2^Q If Zahl>=Wert Then Zahl=Zahl-Wert Print "Bitstellung Stelle von Rechts "+Q+": 1" Else Print "Bitstellung Stelle von Rechts "+Q+": 0" End If Next WaitKey End |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Doch doch, ich schau mir das alles an, und einen ersatz für shr hab ich ja auch schon, mir fehlte eben nur noch shl, und das hab ich eben nicht kapiert, bzw. nicht gewußt, wie umzusetzen.
und danke für das mit shl, ist echt nett, ich hätt das allein nicht gewußt. ähm und dort kommt dann kein Floor davor, richtig? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei der Multiplikation ganzer Zahlen mit ganzen Zahlen kann keine Nachkommastelle vorkommen. Daher wäre Floor hier total überflüssig. Bei der Division ist in diesem Fall Floor wichtig, damit zum Beispiel 3/2 = 1.5 Float bzw. 2 Integer die 1.5 Nachkommastelle abgeschnitten wird. Somit ist das Ergebnis dann 1 und nicht 2. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ach stimmt ja, logisch.heut is net mein tag, äh gestern | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Function NewSHR(number,bits)
Return Floor(number/(2^bits)) End Function Function NewSHL(number,bits) Return number*2^bits End Function Bitteschön. Aber die Originale sind wirklich schneller. Für welche Sprache soll der Code denn sein ? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Heiko |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
glbasic, hab da aber grad gefunden, genau eben diese funktionen.
Mach dort auch einen xors3d wrapper, und um den fastimage wrapper fertig zu stellen, hab ich das halt benötigt. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group