Toon posts:

[VB6] byte in zijn bits opdelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Heb het volgende dringend probleem:

Ik heb in VB een stuk code nodig om een bytewaarde om te zetten in zijn afzonderlijke bitwaarden, anders gezegd wil ik een byte omzetten in zijn machten van 2.
Bijvoorbeeld:
bytData bevat een bytewaarde 164
in een string van bits is dit dus: 10100100

Dit wil ik dus in een functie krijgen om een paar keer te gebruiken. Heb mij al suf zitten piekeren en denk nochtans dat ik er dicht bij zit. Ik geloof dat het met "Mod" en "2^" moet lukken. Kan iemand mijn helpen of mij een voorbeeld bezorgen? Een algemeen algoritme mag ook.

Alvast erg bedankt bij voorbaat!

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Dat doe je met AND. Geen izn om een lang bericht te typen (sorry), check

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=32030&lngWId=1

Dit is in prinicpe het hele verhaal...

Verwijderd

Topicstarter
Sorry, maar dit is dus het omgekeerde van wat ik wil doen |:(
Omgekeerd werken is dus IETS moeilijker :'(

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

code:
1
2
3
4
5
6
7
8
9
10
11
164 = 10100100 = 
  (1) (10100100 and 00000001) +    0
  (2) (10100100 and 00000010) +    0
  (4) (10100100 and 00000100) +    4
  (8) (10100100 and 00001000) +    0
 (16) (10100100 and 00010000) +    0
 (32) (10100100 and 00100000) +   32
 (64) (10100100 and 01000000) +    0
(128) (10100100 and 10000000) +  128
                       ---
                       164

Toch wel die AND.

Siditamentis astuentis pactum.


  • Sensei_D
  • Registratie: Maart 2002
  • Laatst online: 20-08 13:24
je zou zoiets kunnen proberen:

- je zet de eerste bit op 1 (1) en kijkt of dat hoger is als je waarde, zo nee, laat hem op een staan, anders op nul zetten.
- dan zet je de 2de op 1 (3) en kijkt of dat hoger is als je waarde, zo nee, laat hem op een staan, anders op nul zetten.

zo ga je door tot je je waarde hebt. Het is nog vrij lastig wat jij wilt :(

sensei_d.fpv channel


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik ken VB niet (echt) dus ik doe het even in pseudo code
code:
1
2
3
4
5
6
7
8
9
10
11
a = 0
str = ""
while ( a < AANTAL_BITS )
   bitje = 1 bitwise leftshift ( AANTAL_BITS - a )
   if ( byteData bitwise AND bitje )
    str = str + "1"
   else
    str = str + "0"
   end if
   a = a + 1
end while

iets dergelijks zou moeten werken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Zo zou het kunnen doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub ShowBits(intNumber As Integer)
    
    Dim intCount As Integer
    Dim lngBits(15) As Long
    Dim strWork As String
    
    For intCount = 0 To 15
      lngBits(intCount) = (2 ^ intCount)
    Next
    
    strWork = String(16, "0")
    
    For intCount = 0 To 15
      If (intNumber And lngBits(intCount)) Then
        Mid(strWork, 16 - intCount, 1) = "1"
      End If
    Next
    
    MsgBox strWork

End Sub

Stel dat je het project had gelezen en zelf even had nagedacht, had je dat zelf ook wel kunnen verzinnen...

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Op dinsdag 28 mei 2002 18:49 schreef TweakViper het volgende:
Sorry, maar dit is dus het omgekeerde van wat ik wil doen |:(
Omgekeerd werken is dus IETS moeilijker :'(
Die code doet precies wat jij wilt hoor... een integer wordt verdeeld in 16 bits (2b)... elk individueel als boolean te gebruiken (daarom de checkboxes), al moet ik zeggen dat je beter naar de code kunt kijken dan het programma zelf... zit veel overhead achter

Verwijderd

Topicstarter
Ik bedoelde dus dat ik aan de hand van een byte waarde bepaalde SsCheckboxen wou op true zetten.
Heb het zelf al gevonden en werkt perfect:

Private Function ByteToBit(bytData As Byte, intBit As Integer) As Boolean
Dim intIndex As Integer
Dim intData As Integer
Dim intTemp As Integer

intData = CInt(bytData)
For intIndex = 7 To 0 Step -1
intTemp = intData
intData = intData - CInt(2 ^ intIndex)
If intData >= 0 And intIndex = intBit Then
ByteToBit = True
ElseIf intData < 0 And intIndex = intBit Then
ByteToBit = False
ElseIf intData < 0 Then
intData = intTemp
ElseIf intData > 0 Then
intData = intData
End If
Next intIndex

End Function

Nu nog één groot probleem: als ik de value van een SsCheckbox op true zet in de code springt het programma automatisch naar het Click event! En ik wil dat zeker niet! In de help vind ik niets terug van deze control dus daar heb ik ook niets aan :(
Bij de gewone checkboxen staat er dat je wel degelijk een klik op de control of een gotfocus moet hebben om naar deze routine te gaan maar bij deze control is dit dus niet het geval!
Heb al geprobeerd een voorwaarde te stellen zoals gotfocus voordat de code in het click event uitgevoerd wordt maar dit is zelfs geen mogelijkheid, er is zelfs geen gotfocus parameter aanwezig!
Kan iemand mij daarbij helpen?
Tis nogal van levensbelang!!!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 17:07

Gerco

Professional Newbie

Kun je die byte to bit functie niet beter zo schrijven?
code:
1
2
3
4
Public Function TestBit(ByVal b As Byte, ByVal i As Integer) As Boolean
  ' i loopt van 0 tot 7, 0 is de laagwaardigste bit (rechtse)
  TestBit = (b And (2^i)) > 0
End Function

Als je van een byte een string wilt maken (bin$() waar ben je?):
code:
1
2
3
4
5
6
7
8
9
10
Public Function Byte2Str(ByVal b As Byte) As String
  Dim res As String
  Dim i As Integer

  For i = 7 To 0 Step -1
    res = res & CStr(Abs(CInt((b And (2 ^ i)) > 0)))
  Next i

  Byte2Str = res
End Function

En over die click event is MSDN heel duidelijk:
Occurs when the user presses and then releases a mouse button over an object. It can also occur when the value of a control is changed.
Niets aan te doen dus, moet je maar een vlaggetje zetten dat 'ie het negeert ofzo. Al zou ik niet weten waarom, meestal is het zelfs erg HANDIG dat 'ie het zo doet. Maar er zijn natuurlijk altijd uitzonderingen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1