Eigenartige Funktionen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Heiko

Betreff: Eigenartige Funktionen

BeitragSa, Sep 27, 2008 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Sep 27, 2008 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Im grunde wird der eingegebene Parameter in 4 Bytes aufgeteilt und dann über eine Or -Maske so ausgegeben, dass alle 1en übereinander gelegt werden. Also praktisch:

Code: [AUSKLAPPEN]
00000001
00000010
00001101
11100111
------------
11101111 = 239 dec
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Heiko

BeitragSa, Sep 27, 2008 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Sep 28, 2008 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Sep 28, 2008 2:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragSo, Sep 28, 2008 9:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Sep 28, 2008 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 28, 2008 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Sep 28, 2008 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 28, 2008 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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, Or, XOr und Not Bitoperatoren sind und auch immer so angewendet werden. Um ein Ergebnis zu wissen die durch die Operatoren gejagt werden, muß man das Ergebnis zuerst immer in Bits aufteilen und dann operieren. Mit den genannten Operatoren lassen sich durch bestimmte Kombinationen auch alle Rechenarten nachrekonstruieren, was letztendlich ein Computer ständig macht.

Exclamation Ein vor einer Zahl vorangestelltes $ bedeutet, dass es sich um eine Hexzahl handelt. Diese wird vom Precompiler dann direkt umgewandelt. Das geht auch mit % für Binärische eingaben. So kann man zum Beispiel im Code direkt die Bitmasken eingeben und muß diese nicht erst umrechnen. Beispiel:

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

BeitragSo, Sep 28, 2008 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 28, 2008 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Sep 28, 2008 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 28, 2008 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Sep 29, 2008 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ach stimmt ja, logisch.heut is net mein tag, äh gestern

BladeRunner

Moderator

BeitragMo, Sep 29, 2008 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 30, 2008 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group