 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.08.2007, 03:46 Titel: Bits Handlen? |
|
|
Moin,
Ich hatte vor von einem Wert einen bestimmten Bereich seiner Bits auszulesen und wieder in einen Wert umzuwandeln...
hab nun mehrere versuche angestellt, allerdings hat bisher nur einer davon so funktioniert wie ich mir das vorstelle... leider ist es auch die langsamste Methode
Code: |
Dim Test as UByte=129
Dim TestBit as String=Bin(Test,8)
?TestBit
Dim BitHolder1 as String
Dim BitHolder2 as String
for l as integer=0 to 3
BitHolder1+=Chr(TestBit[l])
BitHolder2+=Chr(TestBit[l+4])
next l
?Val("&b"+BitHolder1)
?Val("&b"+BitHolder2)
sleep
|
Vielleicht weiss noch jemand wie man es anders und vorallem schneller machen koennte ?? _________________
 |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.08.2007, 04:13 Titel: |
|
|
schon mal die funktion BIT angeschaut? xD _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.08.2007, 04:34 Titel: |
|
|
Schon etwas uebersichtlicher...
Code: |
Dim Test as UByte=129
Dim BitHolder1 as UByte
Dim BitHolder2 as UByte
for l as integer=0 to 3
If Bit(Test,l) Then BitHolder1+=(2^l)
If Bit(Test,l+4) Then BitHolder2+=(2^l)
next l
?BitHolder1
?BitHolder2
sleep
|
allerdings ist die String Methode fuer meine Zwecke besser geeignet...
Ich habe folgendes damit vor... Ich moechte in diesem Fall Farb Index Informationen in dieser art speichern bzw auslesen...
bei 16 Farben (4 bit) ist es nicht so das problem ein byte 8 bit = 2 werte
aber bei 32 farben sieht es schon wieder anders aus.
Da habe ich 5 bit... also wuerde ich in ein einziges byte nur einen wert bekommen... da verschwende ich aber wieder 3 bits... also sollen diese 3 bits schon ein teil der naechsten information sein also das naechste byte 2 bits rest, und 5 bits neu.. wieder einer uebrig...
ect pp... hoffe ich habs einigermaßen verstaendlich erklaeren koennen  _________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2007, 08:08 Titel: |
|
|
Normalerweise mache ich sowas über AND und OR. Um die ersten 5 Bits auszulesen: erste5bits = gesamtzahl AND 31.
Bei deinem Problem müsste man dann allerdings etwas basteln, weil man ja (wenn man die Werte z. B. über ein INTEGER-Array speichert) ab und zu je einen Teil von zwei verschiedenen Zahlen braucht. Machbar müsste es allerdings schon sein. Ob es mit den Fallunterscheidungen noch schnell ist, müsste man ausprobieren. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2007, 08:53 Titel: |
|
|
(Mist, falscher Knopf - entschuldigt bitte das Doppelposting)
So in der Art könnte ich mir das vorstellen:
speicher(0) enthält die 5 Bit von Information0 und die ersten drei Bit von Information1;
speicher(1) enthält Bit 4-5 von Information1, die fünf Bit von Information2 und das erste Bit von Information3 usw.
Code: | function auslesen(informationsnr)
dim as ubyte startposition, index
startposition = int(informationsnr*5/8) ' bei welchem speicher()-Wert begonnen wird
index = informationsnr mod 8 ' Position innerhalb einer speicher()-Fünfergruppe
select case index
case 0 : return speicher(startposition) AND 31
case 1 : return (speicher(startposition) AND 224)\32 + (speicher(startposition+1) AND 2)*8
case 2 : return (speicher(startposition+1) AND 124) \ 4
case 3 : return (speicher(startposition+1) AND 128)\128 + (speicher(startposition+2) AND 15)*2
[...]
end select
end function |
(ohne Gewähr ...)
Zur Erläuterung des Wertes index (ich hoffe, das verwirrt jetzt nicht mehr als es hilft ):
Code: |
speicher(6) speicher(5) speicher(4) speicher(3) speicher(2) speicher(1) speicher(0)
10000011 11100000 11111000 00111110 00001111 10000011 11100000
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
index=2 | index=0 | index=6 | index=4 | index=2 | index=0
| | | | |
index=1 index=7 index=5 index=3 index=1
|
edit: muss natürlich function statt sub sein ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 27.08.2007, 11:00, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 27.08.2007, 10:48 Titel: |
|
|
??
1. der Wert 'Test' wird an einer Bitposition aufgespalten in H und L - Teil
Der L-Teil -> BitHolder1, der H-Teil -> BitHolder2.
Wozu da FOR...NEXT? Code: | BitHolder2 += Test Shr 4
BitHolder1 += Test And ((2^4)-1) |
2. Die so geteilten Werte sollen in 'BitHolderX' gepackt werden?
Also voher Platz für den Wert schaffen Code: | BitHolder1 Shl= 4
BitHolder2 Shl= 4 |
3. Die Bitposition (Anzahl Farbbits) ist variabel.
Hier als Beispiel 5 Bits (32 Farbwerte) Code: | Sub xyz(Byval Tst As Integer, Byval Bits As Integer, Byref BH1 As Uinteger, Byref BH2 As Uinteger)
BH1 Shl= Bits
BH2 Shl= Bits
BH1 += Tst And ((2^Bits)-1)
BH2 += Tst Shr Bits
End Sub
Dim Test As UByte=129
Dim As Integer BitHolder1, BitHolder2
xyz Test,5,BitHolder1, BitHolder2
?Bin(Test,10)
?Bin(BitHolder1,5)
?Bin(BitHolder2,5)
xyz Test+257 ,5,BitHolder1, BitHolder2
?Bin(Test+257,10)
?Bin(BitHolder1,10)
?Bin(BitHolder2,10)
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.08.2007, 14:27 Titel: |
|
|
ich glaube das sieht schon ganz gut aus
Ich habe jetzt mal versucht eine Testspeicherroutine zu basteln....
Als mir die Idee gekommen ist hielt ich sie eigentlich fuer gut, es stellt sich nun leider raus das es doch etwas komplizierter ist als erwartet
Edit: Code geaendert
Code: |
''Als Test ein Array das die Index Daten einer Umzurechnenden Grafik enthalten soll...
''zum testen mal 10 Werte...
Dim as ubyte myGRX(9)={31,2,30,4,25,6,27,8,19,9} 'aufs geratewohl ausgesucht
Dim ByteRCount as Integer
Dim ByteWCount as Integer
Dim myIndex as String
Dim myCIndex as ubyte ptr=Allocate(1)
Dim BS as Integer
Do
myIndex+=Bin(myGRX(ByteRCount),5)
?myIndex
If Len(myIndex)>7 Then
ByteWCount+=1
myCIndex=ReAllocate(myCIndex,ByteWCount+1)
myCIndex[ByteWCount]=Val("&b"+Left(myIndex,8))
BS=Val("&b"+Left(myIndex,8))
?"Byte Saved :"+Left(myIndex,8)+" "+Hex(BS)
myIndex=Right(myIndex,Len(myIndex)-8)
End If
ByteRCount+=1
If ByteRCount>UBound(myGRX,1) Then
If Len(myIndex) Then
myIndex+=String(8-Len(myIndex),"0")
?myIndex
ByteWCount+=1
myCIndex=ReAllocate(myCIndex,ByteWCount+1)
myCIndex[ByteWCount]=Val("&b"+Left(myIndex,8))
BS=Val("&b"+Left(myIndex,8))
?"Byte Saved :"+Left(myIndex,8)+" "+Hex(BS)
myIndex=""
End If
Exit Do
End If
Loop
myCIndex[0]=ByteWCount+1
?
?"Header Byte = "+HEX(myCIndex[0],2)
?Str(ByteWCount)+" Bytes + 1 Byte Header = "+Str(ByteWCount+1)+" Byte saved..."
Open "TestIndex.bic" for binary as #1
for l as integer=0 to ByteWCount
?Hex(myCIndex[l],2);
put #1,,myCIndex[l]
Next l
Close #1
?
Dim Testbytex as ubyte ptr
Open "TestIndex.bic" for binary as #1
?"Len Of File = "+Str(Lof(1))+" Bytes"
Testbytex=allocate(Lof(1))
Get #1,,*Testbytex,Lof(1)
for l as integer=0 to Lof(1)-1
?Hex(Testbytex[l],2);
next l
Close #1
?
DeAllocate (myCIndex)
?"Ready."
sleep
|
_________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.08.2007, 18:12 Titel: |
|
|
Code: Siehe Oben
Das speichern in dieser Form sieht schon recht vielversprechend aus, auch kommt es dabei nicht auf die geschwindigkeit an...
Jetzt hab ich etwas mit dem ich das laden ueben kann  _________________
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|