Kirjautuminen

Haku

Tehtävät

Koodit: VB6: Yksittäisten bittien manipulointia

Kirjoittaja: Blaze

Kirjoitettu: 14.10.2004 – 14.10.2004

Tagit: ohjelmointitavat, koodi näytille, vinkki

Mistä tahansa muuttujasta on mahdollista manipuloida yksittäisiä bittejä sopivilla laskutoimituksilla. Näin voidaan varastoida kahdeksan boolean (päällä/pois, 1/0) tyyppistä arvoa yhteen kahdeksan bitin Byte -tyyppiseen muuttujaan, kuusitoista kuusitoistabittiseen Integeriin tai jopa 32 32-bittiseen Long -muuttujaan.

Listauksessa 1 on yleiskäyttöinen moduuli yksittäisten bittien asettamiseen ja niiden hakemiseen yhdestä Byte -tyyppisestä muuttujasta. Funktiot on helposti laajennettavissa käyttämään Integerejä tai Longeja.

Edit: Unohtuipas mainita, missä järjestyksessä nuo bitit ovat: Enumeraation "ensimmäinen bitti" on siis tavun alin bitti, LSB (0000 0001), ja "kahdeksas bitti" on ylin bitti, MSB (1000 0000).

Option Explicit

' Enumeraatio, jotta kakkosen potensseja ei tarvitse muistella :)
Public Enum Bitit
    EnsimmäinenBitti = 1    ' 2^0
    ToinenBitti = 2         ' 2^1
    KolmasBitti = 4         ' 2^2
    NeljäsBitti = 8         ' 2^3
    ViidesBitti = 16        ' 2^4
    KuudesBitti = 32        ' 2^5
    SeitsemäsBitti = 64     ' 2^6
    KahdeksasBitti = 128    ' 2^7
End Enum

' Aliohjelma asettaa yhden bitin Muuttuja -parametriksi annetusta Byte -tyyppisestä
' muuttujasta joko todeksi (1) tai epätodeksi (0) , Arvo -parametrin mukaan. Minkä
' bitin, se määräytyy Monesko -parametrin mukaan.
'
' Huomaa, että aliohjelma muokkaa alkuperäistä parametriksi annettua muuttujaa sen
' sijaan, että tekisi siitä kopion ja palauttaisi sen.
Public Sub AsetaBitti(Monesko As Bitit, Arvo As Boolean, ByRef Muuttuja As Byte)
    If Arvo = True Then     ' Bitti käännetään päälle
        ' Suoritetaan Or Muuttujalle ja bittimaskille
        Muuttuja = Muuttuja Or Monesko
    Else                    ' Bitti käännetään pois
        ' Suoritetaan And Muuttujalle ja maskin käänteisarvolle
        Muuttuja = Muuttuja And 255 - Monesko
    End If
End Sub

' Funktio palauttaa True tai False sen mukaan, onko Muuttuja -parametriksi annetun
' Byte -tyyppisen muuttujan Monesko -parametrin mukainen bitti 1 vai 0.
Public Function HaeBitti(Monesko As Bitit, ByRef Muuttuja As Byte) As Boolean
    ' Suoritetaan And muuttujalle ja maskille, jos tulos on 0 bitti oli pois päältä,
    ' jos jotain muuta, bitti oli päällä.
    If (Muuttuja And Monesko) = 0 Then
        HaeBitti = False
    Else
        HaeBitti = True
    End If
End Function

Kommentit

BlueByte [16.10.2004 16:05:06]

#

hmm

VbMan [16.10.2004 19:11:27]

#

mitä hyötyä tosta on?
En oikeen muutenkaan tajunnu

BlueByte [17.10.2004 11:22:20]

#

visual basicin syntaksi tuottaa epilepsia kohtauksia :)

Meitzi [17.10.2004 12:56:54]

#

Onhan tuosta hyötyöä niinkuin opiskelumielessä. Mutta jos kysytään että kannattaako tuota käyttää jossain ohjelmassa, niin vastaus on ei.

Meitsi [18.10.2004 15:07:05]

#

Miksei muka? Ihan hyödyllinen vinkki.

Meitzi [24.10.2004 22:40:19]

#

Paljon järkevämpää käyttää ihan vaan boolean muuttujaa.

Blaze [24.10.2004 22:54:45]

#

Boolean vie (VB:ssä) kaks tavua, tässä saadaan 8 booleania yhteen tavuun. 15:sta tavun säästö! ^^

Okei, myönnetään, että ei tuolla kauheasti oo merkitystä nykykoneilla :)
Tein lähinnä siksi, että tätä kysyttiin keskustelun puolella. Jos joku tästä vielä saa ahaa-elämyksen – "Kas, näinkin voi tehdä!" – on vinkin tehtävä täytetty.

Meitzi [29.10.2004 22:09:16]

#

Mutta se säästö hukataan kyllä tuossa lisäntyneessä koodin määrässä hyvin äkkiä joka vie myös muistia. Mutta kuten sanottu, ei välttämättä silti täysin turha vinkki.

Merri [10.11.2005 18:24:40]

#

Tosin koodin nopeuden kannalta tässä hukataan tehoja järkyttävästi. Proseduurikutsut ovat hidasta hommaa, joten tämän voi unohtaa jos tarvitsee bittien käsittelyssä nopeutta (esim. pakatun kuvatiedoston lataaminen).

moptim [06.05.2007 20:50:44]

#

Heh, osaan näitä kahden potensseja luetella nopiasti lukuun 218 asti. (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144)
En siis tarvinne enumia Bitit. :)

Blaze [07.05.2007 02:43:41]

#

Joo, se oliki idi*köh* muistirajoitteisille ;)

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta