Stap 3: Bitsgewijze bewerkingen
Poorten met vereisen gemengd ingangen en uitgangen, zoals in tabel 1, vaak maskeren operaties die bestaan uit een masker en een bitsgewijze bewerking [16]. Het maskeren wordt geselecteerd uit afzonderlijke bits of een subset van poort bits voor het testen. De bitsgewijze bewerkingen maken de maskerende operaties mogelijk. Op deze manier kunnen de ingangs- en uitgangssignaal bits van een IO-poort worden gescheiden en gemanipuleerd.
Overweeg een paar illustratieve voorbeelden waarmee met Blinky twee zal worden. Deze voorbeelden uitschrijven en manipuleren van de bits van een 8 bits variabele A gegeven door A = rstuvwxy waar de letters r, s, t,..., y zijn stukjes met de waarden 0 of 1. A = 10001000 betekent bijvoorbeeld dat r = 1 en v = 1 en de rest zijn nul. Echter, we zijn bezig met de algemene A en waarden niet hebt toegewezen aan r, s,..., y. In de C-achtige notatie kan men schrijven A = '0brstuvwxy' waar 0b vertelt dat de compiler het nummer is binair; Nochtans, werkt deze notatie niet in een programma.
1. bitsgewijze 'en' vertegenwoordigd door ampersand '&'
Overwegen de 8 bits variabele A = rstuvwxy. Stel dat we willen controleren van de waarde van bits #1 (niet beetje #0). Is x = 0 of is x = 1? Dus we masker definiëren = 00000010. Opmerking de waarde 1 in de bits #1-positie die overeenkomt met de positie van de bit in variabele A waarmee wij willen controleren. Het woord masker is bedoeld om te impliceren dat bepaalde stukjes uit overweging zal worden verwijderd en anderen bezwarende gemarkeerd. Bekijk nu het bit-voor-bit logische en operatie vertegenwoordigen door '&'. Overwegen
Test = A & masker.
Tabel 2 toont de bits van A, masker en het resultaat van een bit-voor-bit en aankondiging van de rechtse kolom van de tabel vertegenwoordigt bit #0, dat ook de minst significante is bits.
Tabel 2: Voorbeeld tonen van de bitgewijze en tussen twee 8 bit variabelen
Variabele A | r | s | t | u | v | w | x | y |
Masker | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Test = A & masker | 0 | 0 | 0 | 0 | 0 | 0 | x | 0 |
De operator '&' is in wezen stukje-bij-beetje vermenigvuldiging met de volgende definities 1 & 1 = 1, 0 1 = 0, 1 0 = 0, 0 & 0 = 0, die kan worden gezien gelijkwaardig aan de Booleaanse Algebra of Aristoteliaanse logica met 1 = True en 0 = False. De eerste twee van de producten (specifiek, 1 = 1, 0, 1 & 1 = 0) bevat de redencode x & 1 = x in tabel 2. Dit is de eigenschap die we nodig hebben voor maskeren met de '&' sinds alle bits in de 'variabele' zal worden toegewezen tot nul behalve voor diegenen waar het masker is een 1. Zie referentie [16] voor meer informatie over bitsgewijze bewerkingen. We kunnen nu vragen of 'Test' gelijk aan nul is. Als Test = 0 dan is x moet nul zijn.
2. bitsgewijze OR vertegenwoordigd door de verticale streep "|"
Nogmaals, overwegen de variabele A = rstuvwxy waar zijn,..., y vertegenwoordigen stukjes met de waarden 0 of 1. Stel dat ditmaal willen wij ervoor zorgen dat bits hebben #0 en #4 de waarde 1 zonder wisseling ieder van naar de anderen in A. Dat wil zeggen we willen instellen van y = 1 en u = 1. Om dit te doen, kunt u overwegen een masker met alle nul bits met uitzondering van #0 en #4.
Mask2 = 00010001
De operatie maskeren in dit geval zullen de bit-voor-bit OR-bewerking weergegeven door de verticale lijn |. De OR heeft het volgende effect op bits: 1 | 1 = 1, 0 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0. De OR zijn vergelijkbaar met de OR kan worden gezien in de Aristoteliaanse logica systeem met 1 = True en 0 = False. Tabel 3 toont de OR-bewerking voor A | Mask2.
Tabel 3: Voorbeeld tonen de bitsgewijze OR tussen twee getallen van 8 bit
8 bits variabele A | r | s | t | u | v | w | x | y |
Mask2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
A | Mask2 | r | s | t | 1 | v | w | x | 1 |
De twee definities van de OR van 1 | 0 = 1, 0 | 0 = 0 (dat wil zeggen, op gelijkwaardige wijze x | 0 = x) laten zien dat deze masker bits in tabel 3 die nul Wijzig niet de bijbehorende bits in de variabele (Zie bits r-t, v-x) bij de berekening van Variable| Mask2 in de onderste rij. Maar de bitsgewijze OR zeker produceert een 1 in de resultaat-bit waar het masker een 1 zoals voor u is en y in de tabel.
Eindelijk dan, als we het resultaat van toewijzen ' A | Mask2' terug naar een (met behulp van de C/C++ toewijzingsoperator voor '='), oftewel A = A | Mask2, dan kunnen we komen tot het gewenste resultaat van instelling bits 0 en 4 de waarde één.
3. bitsgewijze ontkenning vertegenwoordigen door Twiddle ~
Nogmaals, overwegen de variabele A = rstuvwxy waar zijn,..., y vertegenwoordigen stukjes met de waarden 0 of 1. Stel dat ditmaal willen wij ervoor zorgen dat bits hebben #0 en #4 de waarde 0 zonder wisseling ieder van naar de anderen in A. Dat wil zeggen we willen instellen van y = 0 en u = 0. Om dit te doen, kunt u overwegen een masker met alle nul bits met uitzondering van #0 en #4.
Mask3 = 00010001
die gunstig gebeurt hetzelfde als Mask2 in het vorige voorbeeld. Misschien lijkt het gemakkelijkste om te kijken naar tabel 4 om te zien wat er moet gebeuren.
Tabel 4: Voorbeeld tonen van de bitgewijze en tussen twee getallen van 8 bit
8 bits variabele | r | s | t | u | v | w | x | y |
Mask3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
~ Mask3 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Variabele & ~ Mask3 | r | s | t | 0 | v | w | x | 0 |
We weten uit de vorige voorbeelden die OR kan worden gebruikt om te veranderen een beetje op een 1 en die en kan worden gebruikt om te veranderen een beetje op een nul. Dus het lijkt erop dat we de AND. moeten Zoals blijkt uit tabel 4, heeft Mask3 een 1 op deze locaties heeft het resultaat een 0. Als u wilt combineren de Mask3 met de en, we hebben een hersenen storm en beseffen dat we gewoon moeten spiegelen van de bits in Mask3 en past u vervolgens de AND.
De logische niet of ontkenning heeft de volgende definitie ~ 0 = 1, ~ 1 = 0. Dus nu de bit posities in ~ Mask3 (zie tabel 4) met een 0 zijn de posities van de variabele A die moet worden ingesteld op nul. Gebruik van de resultaten voor het eerste voorbeeld en het feit dat y & 0 = 0 (enz) komen we bij de onderste regel van tabel 4. Als we het resultaat terug in variabele A volgens opslaan
A = A & ~ Mask3
vervolgens hebben we afgesloten onze taak van instelling bit #0 en #4 tot nul in het originele nummer. Hier zijn met behulp van de '=' als een C/C++-toewijzing.