1. Dec 06

    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.

    1. AND – &
    2. OR – |
    3. XOR – ^
    4. NOT – ~
    5. RIGHT SHIFT – >>
    6. 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 &amp; 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: , , ,