Använda uppräknade typer som bitflaggor (1 / 3 steg)

Steg 1: bakgrund



Användning av bitflaggor går långt långt tillbaka till början av C-programmering. Tanken är faktiskt mycket enkelt. Istället för att använda en singular heltal som en Boolean värde (sant eller FALSKT eller ett eller noll), kan du använda var och en av bitarna inuti heltalet som en flagga själva. Detta fungerar endast om flaggor är naturligt booleska värden, men lyckligtvis i programmering många gånger de är.

Till exempel kunde vi förklara ett 8-bitars heltal som en flagga att visa några instruktioner eller inte eller inte:

unsigned char DISPLAY_INSTRUCTIONS = 1;

Med en 8-bitars värde skulle tillåta oss att ha 28 möjliga värden eller 256 unika flaggor. Varje flagga skulle ta upp en byte av resurser, antingen på disken eller i core RAM. Vi kan också använda andra värden för standardmassa för flaggan som uint16_t, ett 16-bitarsvärde som lagrar upp till 65 535 unika flaggor, förmodligen mycket mer än vi kunde behöver eller någonsin använda. Men vad händer om vi bara hade, säger, 6 flaggor vi behövs för att spåra? I ovanstående system skulle det kräva sex byte, en byte för varje flagga, men använder bitflaggor kunde vi förvara alla sex flaggor (och lite) inuti en enda byte.

Om du är obekant med binära tal, kan du ta en stund och läsa min instructable på antalet baser, som innehåller binära eller hitta ett antal Självstudiekurser online. Jag antar du redan har ett passerande förståelse av hur binära tal sätts samman. Så, kanske du frågar hur använder man de enskilda bitarna inuti ett heltal som en flagga för användning i koden/programvara? Vanligtvis, detta görs genom att tilldela lite till "1" eller "0" och utifrån sin placering inuti heltalet, kan användas för en bekräftelse eller en negation av det angivna värdet. Till exempel, ta en 8-bitars nummer, säger noll och titta på den.

0000 0000

OK, inget spännande här. Den 1 läge, gör det nu 1:

0000 0000

Vi kan göra samma sak för de två plats:

0000 0010

eller de fyra plats:

0000 0100

eller kanske 32 och 8: e plats:
0010 1000

Vilka siffror gör dessa lite volter? Vi bryr oss inte. Vi är bara bekymrad över de enskilda bitarna inuti numret i detta fall. För att enkelt tilldela flaggvärden till bitar, är det vanligt att använda följande idiomet:

#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

Det har vi gjort våra flaggor. Ta del av mönstret i både det hexadecimala tal och dess binär representation. Så, om FLAG5 är, sedan integer flaggan skulle har lite 5 set (med hjälp av en 1-baserat index, tvärtemot den mer gemensamma 0-baserat, men det är inte viktigt för oss just nu). Att skapa variabeln flagga och ange FLAG5 ser ut så här:

myFlags &= ~FLAG3;

Vi eller flaggor så att några befintliga flaggor kommer att förbli bevarade. Om du och flaggor, du kommer att skriva över alla befintliga flaggor med bitmask din ANDing det till. Detta är användbart när du vill ta bort en flagga:

#define FLAG28 0x00400000

De ovanstående uppsättningarna FLAG3 till noll. Märke att du är ANDing med ett komplement av flaggan.
Men vad händer om du har:

#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();

och du försöker ställa in det med vår 8-bitars heltal? Du har ett överflöd med inkompatibla heltal storlekar och får ett fel, troligen vid körning och inte kompilera tid eftersom kompilatorn kommer vanligtvis främja eller annars implicit konvertera din konstant flagga till den typ som fungeras på. Detta inte alltid fallet, men det är ofta. Detta kan skapa svårt att fånga buggar och den värsta sorten: runtime fel. De är dåligt eftersom de kan vara svårare att spåra, svårare för att replikera, och introducerade till din användare, du vill aldrig göra om möjligt.

Vidare, vad om du behövde en ny flagga, säga FLAG9 men med värdet 0x0080 av någon anledning? Skulle du behöva 1) förlänga din flagga Skriv för att rymma den större storleken och 2) infoga flaggan i din flagga deklarationer och numrera om alla flaggor bakom den. Det är helt enkelt inte genomförbart och definitivt inte underhållas.

Vad gör du om dessa problem? Hur kan vi garantera typsäkerhet och utbyggbarhet till våra flaggor? Vända blad och få reda på!

Se Steg
Relaterade Ämnen

Använda en Online tangentbordet som ett hjälpmedel

detta är kanske det enklaste instructable ända sedan det innebär bara två steg. Men först vill jag ge en kort historik.Ungefär ett år sedan, jag tog en gammal Linux laptop och anslöt den till min TV så jag kunde surfa på webben och titta på online vi...

Använda en LCD-Monitor som en TV utan en dator

LCD-TV har kommit ner i pris, men inte tillräckligt. Om du har en kabel-TV, än din tv tuner är i som rutan, inte i tv, så då varför köpa en tv med en tuner som du aldrig kommer att använda? Tro det eller ej kan du spara nästan $200 när du köper en da...

Använda en Kindle Fire som en skärm för din Raspberry pi

I denna svårlösta jag kommer att visa dig hur man använder en kindle fire som skärm för en raspberry pi. Jag hade en gammal kindle fire som jag fick ett par år tillbaka som jag inte använder längre och jag tänkte, varför inte använda den som en monit...

Använda din laddare adapter som iPod stand

har du en extra eller trasiga telefonladdare? Inte kasta bort det! Du kan använda den som en iPod stå.Steg 1: Demontera din laddare. Och skar en av stiftet med en fräs. Se bilden nedan.Steg 2: That's it! Nu har du själv en iPod stå!...

Använda din lerkruka potten som en Dumpling ångbåt

Göra perfekt ångad fläsk dumplings utan en bambu ångbåt. Jag ska visa dig hur.Steg 1: Konfigurera din lerkruka potten Du behöver hitta ett durkslag som passar i din långsam spis. Jag hade denna följsamma kisel vegetabiliska ångaren ligger runt huset....

Använda en NPN-Transistor som en Switch! (Ingen lödning!)

Gör en LED omkopplare på eller av beroende på en NPN-transistor. Du behöver:1 set av brödunderläggen7 fast - Core ledningar1 NPN Transistor2 AA batterier1 Grön LED1 lysdiod (valfri färg! Jag använde en vit en som lyser en bärnstensfärgad.)Det är allt...

Hur man kan använda ett måttband som en rak kant - Build.com 30 andra tips

inte har en rak kant nära av? Var inte orolig! Här är ett snabbt och enkelt tips på hur man använder ett måttband som en rak kant....

Använda ett dokument klipp som en reservoarpenna stå

tuschpennor torka ut om de inte är täckta omedelbart efter som används. Eftersom begränsningen och uncapping en penna vanligtvis kräver två händer, skulle ställning komma till hands för, säg, skriver sporadiska anteckningar i en bok. Sådan står finns...

Använda din Mac OSX som en trådlös Adapter för XBOX 360

jag såg en annan guide på hur man gör detta på här men det var fruktansvärt fel och lämnade ut så mycket grejer, så jag bestämde mig att göra min egen.Steg 1: Vad du behöverDu behöver verkligen mycket att göra detta.Allt du behöver är:En Mac (denna g...

Hur stänga en dator genom att använda någon anordning som kan skicka e-post

BASICON maskin projektProfessor = Christian EchavezGrupp 10Medlemmar: Connie Tayamen, Elizabeth Sumalde, Marjorie Lim* Internet-anslutning krävs* Microsoft Outlook ska vara öppen....

* Uppdaterad * 3D Skanna ditt huvud och använda den som en schackpjäs.

Spela schack (eller monopol) med din egen anpassade bitar. Som just nu framöver.Det är häftigt, vi vet, men lugna ner dig och följ den instructable eftersom vi talar du tråg.Vi är en liten industridesign kontor i Rotterdam, Nederländerna. För över en...

Använda en combo förstärkare som ett skåp (billigt och lätt)

detta är det enklaste sättet att använda en combo förstärkare som en högtalarlåda för ett separat amp huvud. Jag använder en Line 6 Spider IV combo här men de flesta combos fungerar detta sätt. Obligatoriska delar bara kostar £8,50 ($13) och detta pr...

Använda Gmail som en extern enhet (7GB)

detta är lär du dig att använda ditt Gmail-konto som en extra enhet med 7.18 GB extra utrymme.Du behöver vara ansluten till internet för att komma åt den.Denna preety använder mycket din gmail utrymme som en online-enhet.Steg 1: Ladda ner programmet...

Pacman roligt mellanmål: använda upp som godis

vi gjorde dessa på jobbet en gång som en verksamhet för spel vecka. Barnen hade skitkul att göra dessa och mestadels bara äta allt godis. Detta är också ett bra sätt att använda en del av som påsk-godis som är på väg riktigt snart.BTW, dessa har en m...

Motorsåg Mill bygga, använda & Tips n Tricks

I detta instructable kommer vi att se hur man gör en motorsåg kvarn, hur man använder det, och diskutera några tips och tricks till dolda och mystiska konsten att bordläggning upp nedfallna träd. Välkommen ombord!Om du gillar denna guide hitta det an...

Spela fransmännen kan kan använda Arduino och Summer

Bonjour!Gör din Arduino spela den franska kan kan använda en Summer. Ingen tång. Inga bränder. Det är så rakt fram att det är så upprörande den kan kan innebär.Detta instructable täcker några inledande elektronik info, och fokuserar på att skriva skr...

Hur utforma, skriva ut och använda 3D tryckt läder stämplar!

Remläder och producerar vackra och intrikata mönster för hand kan vara mycket utmanande. Har nu gjort flera läder projekt, jag har lärt mig mycket om att arbeta med läder och som sådan jag letar alltid efter nya och bättre sätt att producera mönster...

Använda I2C_LCD för att felsöka ditt projekt

Den serial monitorn är en användbar felsökare för arduino, den kan skriva ut loggar på datorskärmen. så att, om du vill få löpande information av er projekt, måste du ta en dator med dig överallt. Nu, du kan använda I2C_LCD för att få igång stockar n...

Lätt att konstruera/använda Transistor testare

Hej allaJag fick en transistor testare från gearbest.com och eftersom jag tycker det är ett mycket användbart verktyg, beslutat att göra en instructables om det.I detta instructables ska jag visa dig hur man löda testaren ihop och ge alla funktioner...