广西食品药品监督管理局--广西频道--人民网
Inom digital datorprogrammering opererar en bitvis operation p? ett eller flera bitm?nster eller bin?ra tal p? bitniv?. Det ?r snabba primitiva operationer som st?ds direkt av processorn och anv?nds f?r att manipulera v?rden f?r j?mf?relser och ber?kningar.[1]
P? enkla l?gkostnadsprocessorer ?r bitvisa operationer markant snabbare ?n division, flera g?nger snabbare ?n multiplikation och ibland m?rkbart snabbare ?n addition. Medan moderna processorer vanligen adderar och multiplicerar lika snabbt som de utf?r bitvisa operationer p? grund av sina l?ngre pipelines och andra arkitekturer anv?nder bitvisa operationer ofta mindre kraft p? grund av ett reducerat anv?ndande av resurser.
Bitvisa operatorer
[redigera | redigera wikitext]I f?rklaringarna nedan r?knas bitarnas position fr?n h?ger (den minst signifikanta sidan) till v?nster. Det bin?ra v?rdet 0001 (decimalt 1) har nollor p? alla positioner utom den f?rsta.
Icke (NOT)
[redigera | redigera wikitext]det bitvisa NOT, eller komplementet, ?r en un?r operator som utf?r logisk negation p? varje bit och bildar ettkomplementet till det givna bin?ra v?rdet. Bitar som ?r 0 blir 1 och vice versa. Till exempel:
NOT 0111 (decimalt 7) = 1000 (decimalt 8)
F?r osignerade heltal ?r det bitvisa komplementet (ettkomplementet) till ett tal "spegelbilden" av talet ?ver det osignerade heltalets vidd. Till exempel s? ?r NOT x = 255 - x
f?r osignerade 8-bitars heltal, vilket kan ses som att v?nda om en ?kande f?ljd fr?n 0 till 255 till en minskande fr?n 255 till 0. Ett enkelt, men illustrativt, exempel ?r att ?ndra en positiv gr?skalebild till en negativ.
Det bitvisa (ett)komplementet ?r lika med v?rdets tv?komplement minus ett. Om tv?komplementets aritmetik anv?nds s? ?r
- NOT x = ?x ? 1.
Och (AND)
[redigera | redigera wikitext]Det bitvisa AND tar tv? bin?ra str?ngar av samma l?ngd och genomf?r en logisk AND-operation p? varje par av motsvarande bitar genom att multiplicera dem. S?, om b?da bitarna har v?rdet 1, blir resultatet 1 (1 × 1 = 1), annars 0 (1 × 0 = 0). Till exempel
0101 (decimalt 5) AND 0011 (decimalt 3) = 0001 (decimalt 1)
Operationen kan anv?ndas f?r att avg?ra om en viss bit ?r satt (1) eller ej (0). Till exempel: F?r att avg?ra om den andra biten i 0011 (decimalt 3) ?r satt anv?nder vi ett bitvist AND med ett tal som bara inneh?ller en etta i andra biten:
0011 (decimalt 3) AND 0010 (decimalt 2) = 0010 (decimalt 2)
Eftersom resultatet 0010 inte ?r noll vet vi att den andra biten i 0011 ?r satt. Detta kallas ofta "bitmaskning". (En analogi ?r maskeringstejp som t?cker (maskerar) de bitar som inte skall ?ndras eller delar som ?r ointressanta. I detta fallet maskerar 0 de bitar vi inte ?r intresserade av.)
Om vi lagrar resultatet kan det anv?ndas f?r att nollst?lla valda bitar i ett register. Om vi exempelvis har 0110 (decimalt 6) kan vi nollst?lla den andra biten genom att anv?nda ett bitvist AND med ett m?nster som har en nolla bara i den andra biten:
0110 (decimalt 6) AND 1101 (decimalt 13) = 0100 (decimalt 4)
P? grund av denna egenskap ?r det l?tt att kontrollera ett bin?rt tals paritet genom att testa v?rdet hos den minst signifikanta biten. Till exempel:
0110 (decimalt 6) AND 0001 (decimalt 1) = 0000 (decimalt 0)
Allts? ?r 0110 (6) j?mnt delbart med 2 och allts? j?mnt.
Eller (OR)
[redigera | redigera wikitext]Ett bitvist OR tar tv? bin?ra str?ngar av samma l?ngd och utf?r en logisk OR-operation p? varje par av motsvarande bitar. Resultatet f?r varje position ?r 0 om samma bit i de b?da talen ?r 0, annars 1. Till exempel:
0101 (decimalt 5) OR 0011 (decimalt 3) = 0111 (decimalt 7)
Ett bitvist OR kan anv?ndas f?r att s?tta de valda bitarna till v?rdet 1. Till exempel kan det anv?ndas f?r att s?tta en specifik bit (eller flagga) i ett register, d?r varje bit representerar ett individuellt booleskt v?rde i ett register. S? kan 0010 (decimalt 2) betraktas som en upps?ttning p? fyra flaggor, d?r bara den andra ?r satt. F?r att s?tta den fj?rde flaggan utan att r?ra de andra g?r vi en bitvis OR med 1000 (decimalt 8):
0010 (decimalt 2) OR 1000 (decimalt 8) = 1010 (decimalt 10)
Den h?r tekniken ?r ett effektivt s?tt att lagra ett antal booleska v?rden i s? lite minne som m?jligt.
Exklusivt eller (XOR)
[redigera | redigera wikitext]Ett bitvist XOR tar tv? bin?ra str?ngar av samma l?ngd och utf?r en logisk XOR-operation p? varje par av motsvarande bitar. Resultatet blir 1 om den ena biten ?r 1 och den andra 0, men 0 om b?da bitarna ?r lika. Till exempel:
0101 (decimalt 5) XOR 0011 (decimalt 3) = 0110 (decimalt 6)
Bitvist XOR kan anv?ndas f?r att invertera ("sl? om", som om de vore str?mbrytare) valda bitar i ett register, genom att utf?ra en bitvis XOR med en str?ng inneh?llande 1 p? de positioner man vill invertera. Till exempel om man har 0010 (decimalt 2) kan man sl? om positionerna tv? och fyra genom en XOR med 1010:
0010 (decimalt 2) XOR 1010 (decimalt 10) = 1000 (decimalt 8)
Den h?r tekninken kan anv?ndas f?r att manipulera bitm?nster som representerar booleska tillst?nd.
Assemblerprogrammerare anv?nder ibland XOR som en genv?g f?r att s?tta v?rdet p? ett register till noll, eftersom detta resultat blir f?ljden om man genomf?r en XOR p? ett tal med sig sj?lv, a XOR a = 0
. M?nga processorer ?r byggda s? att XOR anv?nder f?rre klockcykler eller mindre minne ?n att ladda v?rdet noll och spara det till registret.
Matematiska ekvivalenser
[redigera | redigera wikitext]Om x > y f?r icke-negativa heltal, kan de bitvisa operationerna skrivas som:
D?r ?r antalet bitar i f?r alla .
Atom?ra booleska funktioner
[redigera | redigera wikitext]Inom satslogiken anv?nds 3 och 5 (bin?rt 0011 och 0101) som ing?ngsv?rden, eftersom de motsvarar de m?jliga sanningsv?rdena hos tv? atom?ra satser som skall f?rbindas med konnektiv. Exempel 0101 AND 0011 = 0001
s?ger att uttrycket ?r sant bara n?r motsvarande bit i de b?da talen ?r 1 (d.v.s. n?r b?da satserna ?r sanna). F?r tre satser anv?nder man 15, 51 och 85 (00001111, 00110011 och 01010101). Dessa tal ?terfinns i taltriangeln A211344:
1 01 3 5 0011 0101 15 51 85 00001111 00110011 01010101
Bitvis skiftning
[redigera | redigera wikitext]Bitskifte betraktas ibland som en bitvis operation, eftersom det behandlar ett v?rde som en serie bitar snarare ?n en numerisk storhet. Vid dessa operationer flyttas bitarna (skiftas) ?t h?ger eller v?nster. Registerna i en datorprocessor har en fast bredd, s? vissa bitar kommer att "skiftas ut" fr?n registrets ena ?nde, medan samma antal bitar "skiftas in" i den andra. Skillnaden mellan olika skiftoperatorer ligger i vad som skiftas in.
Aritmetiskt skift
[redigera | redigera wikitext]

Vid ett aritmetiskt skift tas bitarna som skiftas ut bort. Vid ett aritmetiskt v?nsterskift fyller man p? med nollor i h?ger?nden, vid ett aritmetiskt h?gerskift fyller man p? med teckenbiten i v?nster?nden, s? att operandens tecken bevaras.
Exemplet nedan anv?nder ett ?ttabitarsregister:
00010111 (decimalt +23) V?NSTERSKIFT = 00101110 (decimalt +46)
10010111 (decimalt ?105) H?GERSKIFT = 11001011 (decimalt ?53)
I f?rsta fallet skiftades siffran l?ngst till v?nster ut och en nolla skiftades in l?ngst till h?ger. I andra fallet skiftades ettan l?ngst till h?ger ut (kanske in i carry-flaggan) och en ny etta kopierades in till h?ger s? att tecknet bevarades. Multipla skift f?rkortas ibland till en operation med angivande av antal steg. Till exempel:
00010111 (decimalt +23) V?NSTERSKIFT-MED-TV? = 01011100 (decimalt +92)
Ett aritmetiskt v?nsterskift med n steg ?r detsamma som att multiplicera med 2n (f?rutsatt att overflow ej intr?ffar), medan ett aritmetiskt h?gerskift med n steg ?r detsamma som att dividera med 2n och runda av mot noll.
Logiskt skift
[redigera | redigera wikitext]![]() |
![]() |
Vid ett logiskt skift skiftas nollor alltid in. Ett logiskt v?nsterskift ?r s?lunda detsamma som ett aritmetiskt.
Ett logiskt h?gerskift s?tter d?remot in nollor i v?nster?nden i st?llet f?r teckenbiten (som ju kan vara noll), ?r det b?st f?r osignerade heltal, medan det aritmetiska ?r b?st f?r signerade tv?komplement?ra bin?rtal.
Rotation utan carry
[redigera | redigera wikitext]![]() |
![]() |
En annan typ av skift ?r cirkul?rt skift eller bitrotation. Vid denna operation "roteras" bitarna som om registrets b?da ?ndar var f?renade. Det v?rde som skiftas in till h?ger ?r det v?rde som skiftades ut till v?nster, och vice versa. Den h?r operationen ?r anv?ndbar om det ?r viktigt att beh?lla alla bitarna och anv?nds ofta inom digital kryptografi.
Rotation med carry
[redigera | redigera wikitext]![]() |
![]() |
Rotation med carry liknar rotation utan carry, med den skillnaden att registrets b?da ?ndar skiljs ?t av carry-flaggan. Den bit som skiftas in ?r carry-flaggans v?rde f?re rotationen och den bit som skiftas ut blir carry-flaggans nya v?rde.
Ett enkelt rotera med carry kan simulera ett logiskt eller aritmetiskt skift om man s?tter carryflaggan i f?rv?g. Om man s?tter carry-flaggan till noll s? ?r en h?gerrotation med carry detsamma som ett logiskt h?gerskift, medan om man i st?llet s?tter carry-flaggan lika med teckenbiten s? f?r man ett aritmetiskt h?gerskift. Av denna anledning har vissa mikrokontroller s?som PIC bara rotera och rotera med carry och inga speciella aritmetiska eller logiska skiftoperatorer.
Rotera med carry ?r speciellt anv?ndbart n?r man skall skifta tal som ?r st?rre ?n processorns ordl?ngd, eftersom om ett tal lagras i flera ord s? m?ste den utskiftade biten i det ena ordet skiftas in i det andra. Genom att biten sparas i carry-flaggan ?r den direkt redo att skiftas in i n?sta ord.
Externa l?nkar
[redigera | redigera wikitext]- Joseph Farrell, 2001, Bitwise Operations in C
Referenser
[redigera | redigera wikitext]- Den h?r artikeln ?r helt eller delvis baserad p? material fr?n engelskspr?kiga Wikipedia.
- ^ Michael Baczynski, 2007, Bitwise gems – fast integer math Arkiverad 31 oktober 2014 h?mtat fr?n the Wayback Machine.