Met behulp van opgesomde typen als Bitflags (1 / 3 stap)

Stap 1: achtergrond


Het gebruik van bits vlaggen manier ver teruggaat tot de vroege dagen van de C programmeertaal. Het idee is eigenlijk heel simpel. In plaats van met behulp van een uniek geheel getal als een Booleaanse waarde (waar of onwaar of één of nul), kunt u elk van de bits binnen het gehele getal als een vlag zelf. Dit werkt alleen als uw vlaggen natuurlijk Boole-waarden zijn, maar gelukkig, in de programmering vele malen ze zijn.

Bijvoorbeeld, kon een 8-bits geheel getal als een vlag voor al dan niet weergeven van sommige instructies of niet verklaart:

unsigned char DISPLAY_INSTRUCTIONS = 1;

Met behulp van een 8-bit waarde zou ons in staat om 28 mogelijke waarden, of 256 unieke vlaggen. Elke vlag zou voeren opwaarts een byte van bronnen, hetzij op schijf of in kern RAM. We kunnen ook andere standaard waarden gebruiken voor de vlag zoals uint16_t, een 16-bits waarde opslaan van maximaal 65.535 unieke vlaggen, waarschijnlijk veel meer dan we konden nodig hebt of ooit gebruikt. Maar wat als we alleen, zeggen hadden, 6 vlaggen we nodig om bij te houden? In de bovenstaande regeling zou het vereisen zes bytes, één byte voor elk vlag, maar met behulp van bits vlaggen we kon slaan alle zes vlaggen (en dan sommige) binnen één byte.

Als u niet vertrouwd met binaire getallen bent, misschien u neem een moment en lees mijn instructable op nummer bases, waaronder binaire of een aantal tutorials online vinden. Ik neem aan dat je al een voorbijgaande begrip van hoe binaire getallen worden samengesteld. Dus, kan u worden gevraagd hoe gebruikt men de individuele bits binnen een geheel getal als een vlag voor gebruik in code/software? Typisch, dit wordt gedaan door een beetje toe te wijzen op "1" of "0" en op basis van de positie binnen het gehele getal, kan worden gebruikt voor een bevestiging of ontkenning van de opgegeven waarde. Bijvoorbeeld, neem een 8-bits getal, zeggen, nul en staar ernaar.

0000 0000

OK, niets spannend hier. In de 1's locatie, maken het nu 1:

0000 0000

Kunnen we hetzelfde voor de twee locatie:

0000 0010

of de vier locatie:

0000 0100

of misschien de 32 en 8e locatie:
0010 1000

Welke nummers maak deze bits flips? Wij schelen niet. Wij zijn alleen bezorgd over de individuele bits binnen het nummer in dit geval. Om gemakkelijk toewijzen vlagwaarden bits, is het gebruikelijk om het volgende idioom:

#define FLAG1 0x01 // 0000 0001
#define FLAG2 0x02 // #define FLAG1 0x01 // 0000 0001
 #define FLAG2 0x02 // 0000 0010
 #define FLAG3 0x04 // 0000 0100
 #define FLAG4 0x08 // 0000 1000
 #define FLAG5 0x10 // 0001 0000
 #define FLAG6 0x20 // 0010 0000
 #define FLAG7 0x40 // 0100 0000
 #define FLAG8 0x80 // 1000 0000
#define FLAG3 0x04 // unsigned char myFlags = 0x00; myFlags |= FLAG5;
#define FLAG4 0x08 // 0000 1000
#define FLAG5 0x10 // 0001 0000
#define FLAG6 0x20 // 0010 0000
#define FLAG7 0x40 // 0100 0000
#define FLAG8 0x80 // 1000 0000

We hebben er onze vlaggen gedefinieerd. Neem nota van het patroon in het hexadecimale nummer zowel de binaire representatie. Dus, als veld Markering5 is ingesteld, dan de integer-vlag zou zijn stukje 5 set (met behulp van een op 1 gebaseerde index, in tegenstelling tot het meer gemeenschappelijk 0 als basis, maar het is niet belangrijk voor ons nu). Maken van de variabele van de vlag en het instellen van veld Markering5 ziet er als volgt:

myFlags &= ~FLAG3;

Wij of de vlaggen zodat geen bestaande vlaggen blijft behouden. Als u en de vlaggen, schrijft u over bestaande vlaggen met het bitmasker op uw ANDing te. Dit is handig wanneer u wilt een markering wissen:

#define FLAG28 0x00400000

De bovenstaande sets Markering3 onderneming tot nul. Merk op dat je ANDing met de aanvulling van de vlag bent.
Maar wat gebeurt er als u hebt:

#define FLAG_1 0x01
 #define FLAG_2 0x02
 #define FLAG_3 0x04
 #define FLAG_4 0x08
 ...
 uint32_t _flags;
 // set a flag
 _flags |= FLAG_2;
 // clear a flag
 _flags &= ~FLAG_3;
 // test bit flag
 if (_flags & FLAG_4)
 do_something();

en u probeert om het te zetten met onze 8-bits integer opgehaald? Heb je een overloop met niet-overeenkomende integer maten en krijg de foutmelding, waarschijnlijk tijdens runtime en niet compilatietijd omdat de compiler zal meestal bevorderen of anders impliciet uw constante vlag te converteren naar het type dat wordt geopereerd. Dit is niet altijd het geval, maar wel vaak. Dit kan leiden tot moeilijk te vangen de bugs, en de ergste: runtime-fouten. Ze zijn slecht omdat ze kunnen moeilijker om op te sporen, moeilijker om te repliceren en geïntroduceerde aan uw gebruikers, die u nooit willen doen indien mogelijk.

Verder, wat als u een nieuwe vlag, bijvoorbeeld veld Markering9 nodig maar met de waarde 0x0080 om welke reden? U zou moeten 1) uitbreiden uw vlag is geschikt voor de grotere omvang en 2) de vlag in de verklaringen van uw vlag invoegen typt en alle vlaggen achter het hernummeren. Dat is gewoon niet uitvoerbaar en zeker niet beheersbaar.

Wat doe je over deze problemen? Hoe kunnen we garanderen typebeveiliging en uitbreidbaarheid om onze vlaggen? De bladzijde omslaan en kom erachter!

Gerelateerde Artikelen

Met behulp van uw auto als een zonne-oven.

Met behulp van uw auto als een zonne-oven.

Met behulp van uw auto als een zonne-oven. (of waarom niet te verlaten kinderen of huisdieren in de auto wanneer het het warm buiten). Ik zou waarschijnlijk hebben gemaakt een ei mcmuffin-look-a-like door te laten wat melk stremmen om kaas en een koe
Schets naar Atmega328P-PU branden op een Breadboard met behulp van Arduino Uno als programmeur

Schets naar Atmega328P-PU branden op een Breadboard met behulp van Arduino Uno als programmeur

Er zijn al verschillende instructables op hoe te branden van de Arduino schets naar Atmega328P-PU op een breadboard met behulp van verschillende USB - UART modules. Echter, zoals de meeste van deze modules zijn gemaakt in China, ze zijn slecht gedocu
FerretPi: Met behulp van Raspberry Pi als een beveiligde FTP-Server

FerretPi: Met behulp van Raspberry Pi als een beveiligde FTP-Server

ik weet wat je denkt: "hoe cool zou het zijn als ik had mijn eigen Google Drive/SkyDrive/Dropbox die ik gebruiken kan wanneer ik wil?" Of misschien bent u gewoon het krijgen in de beweging van de Maker en je denkt dat het is het grootste ding si
Met behulp van slimme telefoon als Motion Sensor Alarm

Met behulp van slimme telefoon als Motion Sensor Alarm

Vandaag, we leven in een wereld waar smart telefoons worden steeds goedkoper, fundamentele Android telefoon gewoon kosten ongeveer 60 dollar in het deel van de wereld waar ik woon in. Ongeacht het merk en model van het OS, bijna elke slimme telefoon
Branden van de Bootloader op de ATMega328 met behulp van Arduino UNO als ISP

Branden van de Bootloader op de ATMega328 met behulp van Arduino UNO als ISP

UPDATE: deze tutorial zal werken op de Arduino IDE 1.0.1, de recente 1.0.5 brengt enkele wijzigingen op de schets van de ISP, dus ik ben niet zeker of het zal werken (ik kocht 2 ATMega328 en verbrand, zowel op 1.0.1).Gebruik 1.0.1 om eventuele proble
Met behulp van een telefoon als een toestel voor een Handheld Radio

Met behulp van een telefoon als een toestel voor een Handheld Radio

dit instructable toont hoe het bouwen van een adaptter die het mogelijk maakt een telefoon als een toestel gebruikt voor een bidirectionele radio. Het voordeel is dat meer ergonomisch lust voor de gebruiker dan een headset mic regeling kan worden. He
Met behulp van een stappenmotor als Automotive snelheidssensor

Met behulp van een stappenmotor als Automotive snelheidssensor

ik was op zoek naar enkele snelheidssensor voor mijn snelheidsmeter projectEr zijn veel ideeën als het gaat om de snelheidssensoren.1-variabele terughoudendheid magnetische halen (zoals automotive ABS sensoren)2 - IR LEDs & IR detectoren3 - Hall effe
Met behulp van de ShopBot als een Plotter

Met behulp van de ShopBot als een Plotter

ik heb zin om dit te doen al geruime tijd, en gewoon de andere dag ik ten slotte gebruikt de ShopBot Alphain TechShop San Jose uitzetten in een gevectoriseerde San Jose Sharks-logo dat ik gemaakt met behulp van Illustrator.Het proces is vrij eenvoudi
Met behulp van foto Sensor als analoge Imput

Met behulp van foto Sensor als analoge Imput

hier zijn we met behulp van verschillende weerstanden van de foto als knoppen. Het idee is als u dekking van dat de weerstand is, net als u zijn het indrukken van een knop.Stap 1: Wat we nodig hebben -Arduino-100 k weerstand-Photosensor-Kabel-Manneli
Met behulp van uw telefoon als een tracking-apparaat

Met behulp van uw telefoon als een tracking-apparaat

als je ooit behoefte aan te weten van de verblijfplaats van een individu, zij het uw kinderen, uw echtgenoot of een persoon die van belang, Apple heeft de app voor u. Dit instructable leert u wat u nodig hebt, waar te krijgen het, en tactiek voor de
Met behulp van Arduino UNO als hoge resolutie 3-CH DAC's

Met behulp van Arduino UNO als hoge resolutie 3-CH DAC's

In deze toepassing geven we een demo over het bouwen van een hoge precisie-voeding met behulp van de DAC-3000 en een hoge precisie referentiebron REF4096.Step1:List van materiaaleBay winkel adres:BUONO UNO R3REF-4096 + DAC-3000UM-UNO (Unsoldered) of
Met behulp van een Comparator als een omvormer

Met behulp van een Comparator als een omvormer

wanneer heb je sommige comparatoren ofwel reeds in uw circuit of ingebouwd in uw MCU, er zijn sommige handige trucs die u kunt gebruiken.  De volgende zal u tonen hoe u een Comparateur kunt gebruiken om een logica-omvormer.Uw signaal wordt toegestuur
Met behulp van schoen rekken als kleerhangers

Met behulp van schoen rekken als kleerhangers

Sommige artikelen van kleding moeten nooit worden gebracht in een droger, met inbegrip van alle kleding met een label zeggen "lijn alleen droge" en alle draad beha's en ondergoed. Meestal moet iets met elastiek ook worden opgehangen om te drogen
Met behulp van Arduino Leonardo als muis en toetsenbord, controle via bluetooth.

Met behulp van Arduino Leonardo als muis en toetsenbord, controle via bluetooth.

Een awsome functie in Arduino Leonardo, waardoor het speciale bord, is dat het als muis en toetsenbord op de computer fungeren kan. Dit zou nuttig zijn om de controle van de computer door andere manier, zoals een joystick en hier BLUETOOTH!dingen die