Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bits Handlen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.08.2007, 03:46    Titel: Bits Handlen? Antworten mit Zitat

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 traurig

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.08.2007, 04:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.08.2007, 04:34    Titel: Antworten mit Zitat

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 happy
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 27.08.2007, 08:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 27.08.2007, 08:53    Titel: Antworten mit Zitat

(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 neutral ):
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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.08.2007, 10:48    Titel: Antworten mit Zitat

traurig ??
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.08.2007, 14:27    Titel: Antworten mit Zitat

ich glaube das sieht schon ganz gut aus lächeln

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 grinsen

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 happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.08.2007, 18:12    Titel: Antworten mit Zitat

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 lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz