I feiringen av fullført datateknikk eksamen, skal jeg nå sette kunnskapene mine på en siste prøve. Jeg skal nå skriv en artikkel om bitwise-operasjoner som en gjerne bruker med et høynivåspråk som f.eks Java eller C++. Før, på en tradisjonell prosessor, ble bitwise-operasjoner gjerne brukt av en CPU i steden for addisjoner og substraksjoner. Dette er som regel ikke tilfellet nå i en CPUs mer moderne form, nå som addisjon og substraksjon er like rask som bitwise-operasjoner.
Først litt om hva en bit og en byte er. En bit er et siffer i en binær sammenheng. Et binært tallsystem (også kjent som 2-tallsystemet) er det som blir brukt internt av en datamaskin og all data og innhold i en maskin brytes ned til binære mønster for maskinen. Her er det kun 0 og 1 (høy spenning eller lav spenning) som duger.
Jeg nevnte at bit var et siffer i et binært mønster. En byte (som dere kanskje kjenner igjen som en størrelsesenhet på maskinen) er en samling av slike bits. 8 bits for å være helt nøyaktig. I en byte er derfor maksimalverdien 255 i ti-tallsystemet (1111 1111 i to-tallsystemet).
Et ord derimot er en samling av bits uten en fast størrelse. Ord er et bitmønster i en lokasjon/linje i et minne. Et ord kan derfor være på f.eks 16 bit, 32 bit, 64 bit.
Bitwise-operasjoner
Vi har 6 forskjellige bitwise-operasjoner.
- AND – &
- OR – |
- XOR – ^
- NOT – ~
- RIGHT SHIFT – >>
- LEFT SHIFT – <<
(Det du ser til høyre, etter -, er tegnene som blir brukt i høynivåspråk for disse operasjonene.)
AND
AND blir brukt til å se hvilke bits som korresponderer i et bitmønster. Her tar jeg utgangspunkt i et mønster på lengden 8 bits, altså en byte.
Her tar jeg utgangspunkt i tallene 133 og 203. 133 er 1000 0101 og 203 er 1100 1011.
// 1000 0101 & 1100 1011
1000 0101
1100 1011
------------
1000 0001
Som du ser resulterer det i et bitmønster som har 1 hvor det er 1 på begge bytene og 0 hvor det er ulikt eller likt på 0.
Dette kan du f.eks bruke til å finne om en gitt bit er satt eller ikke:
// Denne returnerer 0 (boolsk verdi: false) da bitverdien for 2 ikke er satt.
System.out.println(4 & 0x02);
OR
OR blir brukt til å se hvilke to bits sammenlagt har 1. Dvs dersom en av bitene på to bitmønster har 1 vil resultatet si 1.
Jeg tar igjen utgangspunkt i samme tall som på AND.
// 1000 0101 | 1100 1011
1000 0101
1100 1011
------------
1100 1111
Som du ser blir det 1 hvor en av bitmønstrene har 1 i seg på den plassen.
XOR
Denne operasjonen er en “enten eller” operasjon. Den blir 1 hvis og bare hvis de to bitene er ulike.
Tar fortsatt utgangspunkt i samme tall.
// 1000 0101 ^ 1100 1011
1000 0101
1100 1011
------------
0100 1110
NOT
NOT-operasjonen er en måte å finne det motsatte på. Eller du kan gjerne si at du vil finne negasjonen av mønsteret.
Tar fortsatt utgangspunkt i samme tall som før.
~1000 0101
------------
0111 1010
LEFT SHIFT
LEFT SHIFT-operasjonen flytter alle bit-verdiene ett hakk til venstre dersom noe annet ikke er gitt. Kan også flytte flere hakk til venstre dersom nødvendig.
Tar utgangspunkt i det første tallet gitt fra AND-operasjonen.
1000 0101 <<
------------
0000 1010
1000 0101 << 2
------------
0001 0100
RIGHT SHIFT
Samme som forrige operasjon, bare motsatt vei. Altså til høyre.
1000 0101 >>
------------
0100 0010
1000 0101 >> 2
------------
0010 0001
Noen ord til slutt
Håper dette skriveriet kan hjelpe noen til å forstå hvordan man skal bruke bitwise-operasjoner. I alle fall hvordan de fungerer. Disse operasjonene har mange forskjellige bruksområder. For eksempel kan “shifting” brukes til å finne den mest signifikante biten i et mønster og således finne ut om verdien er negativ eller positiv. NOT kan f.eks brukes til å finne absoluttverdien av et negativt tall osv.
\\ emneord: bits, byte, java, prosessor