wertebereich von SHR?

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

hamztata

Betreff: wertebereich von SHR?

BeitragDo, März 19, 2009 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
von 0-255, oder irre ich mich?

Silver_Knee

BeitragDo, März 19, 2009 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
der Wertebereich ist der eines Integers dh max 2^31 bis - (2^31)+1
 

hamztata

BeitragDo, März 19, 2009 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist aber komisch, hab werte die weit in den minux bereich gehen und dort ist das das ergebnis immer 255.
also kurz erklärt. werte im positiven bereich bei Code: [AUSKLAPPEN]
ergebnis = wert shr 24
drehen das ergebnis hoch.aber solabld es in den negativen bereich geht(also wert = -50000000 z.b.) dann ist das ergebnis schwups bei 255.


habs mal aufgeschrieben.
Code: [AUSKLAPPEN]
16777215 shr 24  = 0
100663296 shr 24 = 6
889848065 shr 24 = 53
-5737356 shr 24 = 255



das ist korrekt so, aber mit der gleichung Code: [AUSKLAPPEN]
ergebnis  = wert/2^s
geht das ja nun nicht, wie geht das denn, die werte sind richtig, aber wie erzeuge ich die manuell basierend auf Code: [AUSKLAPPEN]
wert/2^s
?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 19, 2009 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Bevor du mit Bitoperationen rumhantierst, solltest du vielleicht erstmal das binäre Zahlensystem aneignen. Zum einen können wir dir schlecht alles vor die Füsse legen, wenn nicht einmal die Grundlagen verstanden wurden. Dazu bietet sich Google an, aber auch Bin zum rumspielen.

Blitz3D benutzt ausschliesslich SIGNED -Zahlen, welche ein Vorzeichenbit beinhalten. Bei negativen Werten ist also das erste Bit immer =1 (eines Integers).

Edit1: Wenn du eine Zahl mit dem Wert von 16777215 hast (da brauch ich garnich lange überlegen, denn ich kenne den Wert), dann ist das als binäre Form folgender Zahlenwert 111111111111111111111111 bin. Wenn du nun das ganze um 24 Stellen nach recht verschiebst und die ganzen 1en rechts ''raus'' fallen, dann hast du einen Endwert von 0.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragDo, März 19, 2009 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
darum geht es nicht.
ich habe hier im forum das so gesehen wie man shr nachbauen kann, und genau das will ich auch machen.
habe ein bb beispiel als vergleich, also genaus das gleiche.
nur dass da nun unterschiedliche werte rauskommen.

meine frage war und ist also nur, wie die formel aussehen müsste um das gleiche wie beim blitz SHR zu erzielen.
Und ich wäre echt dankbar für eine lösung diesbezüglich.
kann aber auch gut sein, daß ich darauf keine antwort erhalte.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 19, 2009 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dir deinen geposteten Wert von -5737356 shr 24 = 255 mit Bin ansehen würdest, dann wüsstest du auch warum das Ergebnis 255 ist. Wenn du nun noch nach SIGNED und UNSIGNED im Internet suchen würdest, dann wüsstest du auch den Grund, warum bei dir zum Teil so komische Werte raus kommen. Denn Blitz3D arbeitet mit allen Integervariablen mit SIGNED. Das heisst, dass das erste Bit bei negativen Werten immer eine 1 ist, der Integerwert immer eine negativen Inhalt hat.

Um eine SHR-Funktion selbst zu bauen, musst du also zuerst das erste Bit eines Integers zwischenspeichern und auf 0 setzen. Dann kannst du deine Divisionsrechnug anwenden. War das erste Bit (Zwischenspeicher) eine 1, dann muß du dein Wert um +1 erhöhen und noch mit einem - ''minus'' davor versehen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragDo, März 19, 2009 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
okay theoretisch hab ich das verstanden, und weiß nun soviel, mittels bin nach binär wandeln, aber wie soll ich jetzt das erste bit zwischenspeichern?
als string auslesen, und die wichtigere frage, wie ändere ich es denn nach null und bekomm wieder den passenden dezimalwert zurück?

ich weiß, ich frag noobisch, aber das ist in meinem code der momentan einzigeste fall mit bitverschiebung etc.

achja, bin hab ich auch nicht, da ich bb code konvertiere, hab aber eine vergleichbare formel gefunden um bin zu ersetzen.

[edit]
Zitat:
Um eine SHR-Funktion selbst zu bauen, musst du also zuerst das erste Bit eines Integers zwischenspeichern und auf 0 setzen. Dann kannst du deine Divisionsrechnug anwenden. War das erste Bit (Zwischenspeicher) eine 1, dann muß du dein Wert um +1 erhöhen und noch mit einem - ''minus'' davor versehen.

habs ja kapiert, nur eine frage, ich wandel die dec2bin um, mach nen string draus, prüfe das erste bit.
soweit sogut.
wenn das bit jetzt 0 ist, alles so lassen?
und wenn es 1 ist, dann +1 und nen minus davor?
das ist der punkt, den ich nicht verstehe, den binärwert +1, also damit aus der 1 eine Null wird?
oder die ganze dec zahlt + 1 und ein minus davor, oder wie meinst du das?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 19, 2009 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht mit Strings arbeiten, wenn man es verhindern kann. Überprüfe mit If Wert And $80000000 Then. Und das ausfiltern der 1 kannst du über Wert = Wert And $7FFFFFFF machen. Das +1 muß sein, weil ein Binärwert von 10000000'00000000'00000000'00000000 in Dezial -1 ist, obwohl das letzte Bit ja den Zustand 0 hat. Sonst würde man ja die 0 doppelt haben. Einmal +0 und einmal -0, was vollkoment Quatsch wäre. Aus diesem Grund muß beim Vorzeichen der eine Wert hinzugerechnet werden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragDo, März 19, 2009 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt bin ich vollkommen verwirrt.
damit komm ich nun garnicht klar.
nun auch noch hex dazu.
also da werd ich wohl doch zu strings greifen, weil mit hex hab ich mich nun garnicht beschäftigt.

mannomann, all das für eine einfache rechnung, die ich konvertieren muss.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 19, 2009 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man einer Wertezuweisung statt Wert=2147483648 lieber Wert=$80000000 schreibt ergibt es absolut keinen Unterschied, zudem was der Rechner am Ende daraus macht. Denn das $ zeigt den Precompiler, dass dieser Wert vom hex nach bin statt dec nach bin für den Compiler (ohne ''Pre...'') umgewandelt werden muß.

Es sollte auch gleich klar stellen, wozu es überhaupt das hexadezimale Zahlensystem gibt. Damit man als Mensch einfacher dem Computer Werte zuweisen kann. Denn sobald es um Bitoperationen geht, kann man auch als Mensch mit dem hexadezimalen Zahlensystem im Kopf rechnen, und diese dann gleich auch so gedanklich oder schriftlich ins binäre umwandelt. Wärend man mit dem dezimalen System gleich den Taschenrechner zücken muß, wenn die Werte zu groß werden.

Mit anderen Worten: Es ist komplett gleich, was du im folgendem schreibst (alles gleich).

- If Wert And $80000000 Then
- If Wert And 2147483648 Then
- If Wert And %10000000000000000000000000000000 Then

Dein Post zeigt aber auch, dass du anscheinend nicht gewillt bis, dich mit den Zahlensystemen aussernander zu setzen. Viel mehr habe ich das Gefühl, dass du uns zeigen willst, dass du ''ja eigendlich schon alles weißt, aber hier und da noch klein wenig Probleme damit hast''. Dazu kann ich nur sagen ''Falsch!''. Lerne erst die Zahlensysteme kennen. Arbeite mit ihnen. Versuche dir die grundlegensten Eigenschaften eines Computers zu verinnerlichen, und dazu gehören nun mal And, Or, XOr, Not, Shr, Shl etc...

Erst wenn du es im Blut hast, werden die Antworten zu deinen Fragen wie aus der Kanone geschossen kommen. Du kannst unmöglich eine Shr-Alternative programmieren, wenn du nicht verstehst was überhaupt ein Bit ist, und warum der Computer komplett darauf angewiesen ist.

Nochmal, was bereits (ich glaub) BladeRunner hat versucht zu vermitteln. Das hexadezimale sowie das dezimale Zahlensystem sind für den Computer nur eine zusätzliche Belastung, und sind nur für den Programmierer erst überhaupt in einer Programmiersprache eingebracht worden. Es handelt sich lediglich nur um eine Darstellung, ohne die Werte als solche zu ändern.

Ich kann ja auch 11 dec schreiben oder XI (römisch), so wie auch $B oder %1011. Alles nur Zahlensysteme mit unterschiedlicher Darstellung, aber gleichen Werteinhalt.

Edit1: Ich für mein Teil habe alles gesagt. Ich wüsste auch nicht wie ich es besser formulieren könnte, was andere auch schon nicht geschafft haben. Wenn du das alles wissen willst, führt kein Weg daran vorbei, sich die grundlegensten Grundlagen anzueignen. Ohne diese wirst du immer wieder an irgendwelchen Sachen scheitern und Auswege über Stringvariablen suchen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragDo, März 19, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaub du hast meine letzte frage überlesen...
Zitat:
wenn das bit jetzt 0 ist, alles so lassen?
und wenn es 1 ist, dann +1 und nen minus davor?
das ist der punkt, den ich nicht verstehe, den binärwert +1, also damit aus der 1 eine Null wird?
oder die ganze dec zahlt + 1 und ein minus davor, oder wie meinst du das?


deine formulierung war etwas undeutlich.
also ich nehm irgendeine dezimalzahl als beispiel, mach binär draus, prüfe die erste stelle auf 1.
ist erste stelle 0, kann ich dies als wert für shr lassen.
ist der wert 1...... dann die binärzahl +1, also die erste stelle die auf 0 geändert wurde eins höher setzen?
oder die dezimalzahl?
wobei das vorzeichen ja auch noch hinzukommt, wo es sich wohl bei dem hinzuaddieren der 1 um eine dezimalzahl handeln muss.

mir ging es jetzt nicht darum die gleich aufgabe in 3 verschiedenen zahlensystemen lösen zu können, ich wollte vorhin nur wissen wie sich das nun mit dem hinzuaddieren der 1 und dem vorzeichen verhält, mehr nicht.


[edit] stell dir vor, du hast mehrere tausend zeilen code, und dir fehlt nur grad diese korrekte SHR umschreibung......

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 20, 2009 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Local A=%11111111001001001110011100110011
Local V=3


Print "Quelle:   "+Bin(A)
Print "Original: "+Bin(A Shr V)
Print "Selbst:   "+Bin(xShr(A,V))


WaitKey


Function xShr$(FA,FV)
   
   Local ICount%
   Local IByte1%=FA/$1000000 And $FE
   Local IByte2%=FA/$10000 And $FE
   Local IByte3%=FA/$100 And $FE
   Local IByte4%=FA/$1 And $FE
   Local ITemp1%=(FA And $1000000)/$1000000
   Local ITemp2%=(FA And $10000)/$10000
   Local ITemp3%=(FA And $100)/$100
   
   For ICount=1 To FV
      IByte1=(IByte1/2)
      IByte2=(IByte2/2)+ITemp1*$80
      IByte3=(IByte3/2)+ITemp2*$80
      IByte4=(IByte4/2)+ITemp3*$80
   Next
   
   Return IByte1*$1000000+IByte2*$10000+IByte3*$100+IByte4*$1
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragFr, März 20, 2009 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
danke dir, siehste, das hätte ich nie und nimmer hinbekommen so schnell.
aber ich hab das ganze bin mal weggenommen und deizam draus gemacht.

hab als wert die besagte -5737356 eingesetzt, kommt beim original die 255 wie gewünscht raus, bei selbst, jedoch...... 16711680


also A=-5737356
V=24

aber find ich echt nett von dir, ehrlich, bin nicht zu faul dazu, brauch nur diese eine funktion bzw. eigentlich SHL noch(im moment nicht so wichtig) und hab sonst nix mit bitshifting in zukunft zu tun, wahrscheinlich.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 20, 2009 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Muß natürlich so heissen:

Code: [AUSKLAPPEN]
Function xShr$(FA,FV)
   
   Local ICount%
   Local IByte1%=FA/$1000000 And $FF
   Local IByte2%=FA/$10000 And $FF
   Local IByte3%=FA/$100 And $FF
   Local IByte4%=FA/$1 And $FF
   Local ITemp1%
   Local ITemp2%
   Local ITemp3%
   
   For ICount=1 To FV
      ITemp1=(IByte1 And $1)*$80
      ITemp2=(IByte2 And $1)*$80
      ITemp3=(IByte3 And $1)*$80
      IByte1=(IByte1/2)
      IByte2=(IByte2/2)+ITemp1
      IByte3=(IByte3/2)+ITemp2
      IByte4=(IByte4/2)+ITemp3
   Next
   
   Return IByte1*$1000000+IByte2*$10000+IByte3*$100+IByte4*$1
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragFr, März 20, 2009 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
super danke dir.
darf ich dich was fragen.
das "AND" ist noch ein problem.
also funktioniert tadellos in blitz.
bei der gleichung aber gibt es bei mir probleme wenn FA kleiner 0 ist.
And heißt bei der konvertierung nämlich bAND und kommt scheinbar nicht mit negativen zaheln klar.

ach man ich habs grad echt nicht leicht.
wenn ich die gleichung

Code: [AUSKLAPPEN]
Local IByte1%=FA/$1000000 And $FF

direkt nach dezimal umstelle, und ausrechne, also mit AND und bei mir mit bAND kommt bei bb 255 raus, bei mir jedoch 0, wenn FA=-5737356 und FV = 21. bei positiven werten jedoch funktioniert es.

Vielleicht hast du irgendeine idee für mein problem.

hier mal der code, der das brauch.trifft nur zu, wenn alphalevel = 128

Code: [AUSKLAPPEN]
Function xTestRendered% (xPoint%, yPoint%, alphaLevel%=0, Loc%=0)
   If xTestRendered_ (xPoint, yPoint, Loc, FI_Test, 1) And alphaLevel>0 And FI_Test\Texture<>0 Then
            If  xReadPixel( FI_Test\TextureX, FI_Test\TextureY, xTextureBuffer(FI_Test\Texture,FI_Test\Frame) ) Shr 24 < alphaLevel Then FI_Test\Result = 0
   EndIf
   Return FI_Test\Result
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 20, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, meine Funktion xShr liefert bei mir die gleichen Ergebnise wie das original Shr. Allerdings befürchte ich, dass du vielleicht zu etwas ganz anderem hin willst, aber den ''Umweg'' über Shr zu lösen versuchst. Vielleicht könnte man dir besser helfen, wenn du uns schilderst, was du genau vor hast.

Im übrigen würde ich nicht verschiedene And, Operatoren und andere Dinge innerhalb einer Zeile abfrage. Zumindest müsste man dann mit Klammern arbeiten, oder auf mehrere Abfragen aufteilen.

Statt:

Code: [AUSKLAPPEN]
If xTestRendered_ (xPoint, yPoint, Loc, FI_Test, 1) And alphaLevel>0 And FI_Test\Texture<>0 Then


dann:

Code: [AUSKLAPPEN]
If xTestRendered_ (xPoint, yPoint, Loc, FI_Test, 1) Then
  If alphaLevel>0 Then
    If FI_Test\Texture<>0 Then


Denn And arbeitet auf Bitebene wie folgender Code beweist.

Code: [AUSKLAPPEN]

If 2 And (1>0) Then
   Print "Jawohl"
Else
   Print "Nein"
End If

WaitKey


Obwohl If 2 Then und (1>0) jeweils ein True liefern, ist das Ergebnis False. Weil auf der Bitebene überlagern sich die Werte 2 und 1 (1>0) nicht, und das Ergebnis ist dann eben False.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragFr, März 20, 2009 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
der obige code ist das was ich "übersetzen" muss.
bits nach rechts schieben, wobei der erste dezimalwert eben auch negativ sein kann.

wobei aber wohl glbasic seine probleme hat, da bei negativen werten immer 0 rauskommt(war glaub ich so).
also das shr funktioniert sozusagen nur bei positiven werten.
versuch grad das ganze inline c++ zu machen, will aber noch nicht so richtig.

eine frage am rande....der code If xTestRendered_ (xPoint, yPoint, Loc, FI_Test, 1) And alphaLevel>0 And FI_Test\Texture<>0 Then
ist das AND da nun IF bezogen, oder als binäre addition?

falls es interessiert, hier mal der c++ code dazu

Code: [AUSKLAPPEN]
inline int fTestRendered(int xPoint, int yPoint, int alphaLevel, int Local) {
   if (pTestRendered(xPoint, yPoint, Local, &FI_Test, 1) && alphaLevel>0 && FI_Test.Texture!=0) {
      if ( (xReadPixel(FI_Test.TextureX, FI_Test.TextureY, xTextureBuffer(FI_Test.Texture,FI_Test.Frame))>>24)<alphaLevel ) FI_Test.Result = 0;
   }
   return(FI_Test.Result);

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 20, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
And ist keine Bnäraddition, sondern ein Operator. siehe dir mal den Befehl an. Hier neben an klicken ---> And

Wie es funktioniert, kannst du auch mit folgendem Code schnell selbst ausprobieren:

Code: [AUSKLAPPEN]
Print (1 And 1)
Print (1 And 2)
Print (2 And 2)

WaitKey


Ansonsten hast du zwei meiner letzten Vorschläge anscheinend einfach ignoriert.

1) Hast du versucht die eine Zeile in drei aufzuteilen?
2) Was soll das Ergebnis deiner Funktion sein? Denn es ist gut möglich, dass es ganz ohne Shr oder sonstigem geht. Ohne zu wissen was das machen soll, kann ich dir natürlich 100 andere Wege zeigen, wie man Shr umschreiben kann, wenn das Grundproblem ein ganz anderes ist, wird das alles aber nichts bringen.

Im übrigen sagt mir deine Funktion da unten nicht besonders viel, da ja bereits die Funktion xTestRendered_ ''mit Unterstrich'' von dir nicht aufgelistet ist.

Grundlagen, von den ich bereits vom Anfang an gesprochen habe:

Exclamation (wert>0) ist 1, wenn wert größer als 0 ist. Ansonsten ist das Ergebnis 0.

Exclamation demnach müsste xTestRendered_() im Idealfall eine 1 oder 0 zurück liefern, damit es mit And agieren kann, oder eben nicht. Kann ich aber nicht testen, da die Funktion nirgend aufgelistet ist.

Exclamation Ob glbasic nun anders mit negativen Zahlen umgeht, kann ich nicht sagen. Ich glaube mich allerdings an einer anderen Vorgehensweise bei negativen Zahlen zu erinnern, als ich es bei Blitz gesehen habe. Kann aber auch nur eine Täuschung einer falschen Erinnerung meinerseits sein.

Exclamation If geht dann nach Then, wenn das Ergebnis True ist. demnach wäre es ratsamer - der Übersichtshalber - das ganze auf mehrere Zeilen zu verteilen, da es dann auch um einiges einfacher ist, sich auf Fehlersuche zu begehen. Was du nun mit deiner einen Zeile ständig versuchst, kannst du doch bei einerm Fehler überhaupt nicht mehr nachvollziehen.

Also nocheinmal. Was soll die Funktion denn letztendlich machen? Ohne zu wissen was sie machen soll, kann ich dir nicht mehr weiter helfen. Denn ständig auf Shr rumzuhacken - welches im übrigen 1:1 mit dem von Blitz originalem funktioniert - bringt keine Besserung.

-

Worauf ich schon die ganze Zeit hinaus wollte ist auch: Falls du nur ein Byte aus einem Integer brauchst, dann muß du in erster Linie überhaupt nichts rumschieben. Dann nimmt man sich nur das eine Byte und gut ist.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragFr, März 20, 2009 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
die TestRendered_ Funktion kann ich hier nicht anbieten.Weeiill....die steckt inner dll.
in der funktion wird geprüft ob der mauszeiger mit einem geladenen bild kollidiert, und gibt dann true zurück.
dann kommt das if then gebilde ins spiel.
dort wird der alphawert gecheckt.
wenn vorhanden, wird aus true wieder false.
also wenn er über einen bereich mit alphawert kommt, wo aber ein bild liegt(das zu prüfende)dann wird aus dem eigentlichen true ein false.

daher das readpixel teil.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 20, 2009 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Alternative kann ich dir die Draw3D anbieten. Diese beinhaltet GetTexel3D welches im grunde so arbeitet, was du mit geschildert hast. Benötigt aber Blitz3D, und willst es - glaube ich - auf GL-Basic portieren?

Wie ich vermutet habe, brauchst du aber überhaupt nichts mit Shr bearbeiten.

Folgende Codezeile sollte den Alphachannel überprüfen:

Code: [AUSKLAPPEN]
If (FarbCode And $FF000000) > 0 Then


Wenn du erst ab ein bestimmten Alhawert springen willst, musst du die beiden FF entsprechend anpassen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group