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
hmm
mitä hyötyä tosta on?
En oikeen muutenkaan tajunnu
visual basicin syntaksi tuottaa epilepsia kohtauksia :)
Onhan tuosta hyötyöä niinkuin opiskelumielessä. Mutta jos kysytään että kannattaako tuota käyttää jossain ohjelmassa, niin vastaus on ei.
Miksei muka? Ihan hyödyllinen vinkki.
Paljon järkevämpää käyttää ihan vaan boolean muuttujaa.
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.
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.
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).
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. :)
Joo, se oliki idi*köh* muistirajoitteisille ;)