2013-12-08

Bitwise/Bit Shift operatorer och bitar

Detta är mina anteckningar från första veckan i Säker mjukvara kursen. Ni från klassen får gärna redigera denna post om ni vill lägga till något eller korrigera eventuella fel.

I Java används signed bytes som standard. Signed byte kan ha värde mellan -128 till +127
Unsigned bytes kan inte vara ett negativt värde. Värdet på en unsigned byte kan vara 0 till 255

En byte är 8 bitar. Alltså 8 ettor/nollor, dessa ettor och nollor kallas Binärtal
01010101 = 1 byte

Räkna decimaltal, binärtal, hexadecimal:

























En Hexadecimal siffra/bokstav motsvara 4 bits (1 nibble).
Hex F = 1111 Binärt.
Om man har två tecken i ett hexadecimal tal är det 8 bitar.
Hex FF = 11111111 Binärt.
Hex F0 = 11110000 Binärt.

För att tilldela binära värden till en byte i Java kan man skriva så här.
byte b = (byte) 0b100001;
Variabel b har nu värdet 33.

För att tilldela hexadecimala värden till en byte.
byte b = (byte) 0x4A;
Variabel b har nu värdet 74

Bitwise operatorer i Java

NOT = ~
  • Flippar bitarna så alla ettor blir nollor och vise versa.
  • ~1010 = 0101
AND = &
  • Jämför två binära tal. Om en 1a finns i båda talen på samma position blir resultatet 1 på den platsen.
  • 1101 & 0111 = 0101
OR = |
  • Jämför två binära tal. Om endast en 1a finns i något av talen blir resultatet 1 på den platsen.
  • 0101 | 1100 = 1101
XOR = ^
  • Samma som OR men om talet är lika på båda blir resultatet 0.
  • 0101 ^ 1100 = 1001
Bit Shift operatorer i Java

Bit Shift left = << 
  • Flyttar bitarna till vänster. Man anger hur många steg med en siffra efter operatorerna << 2
  • 0110 << 1 = 1100
  • Den nya biten/bitarna som kommer in från vänster sida har alltid värdet 0.
Unsigned Bit Shift right = >>>

  • Samma som bit shift left men åt höger
  • 1100 0000 >>> 2 = 0011 0000
  • Den nya biten/bitarna som kommer in från vänster sida har alltid värdet 0.

Signed Bit Shift right (används nästan aldrig i praktiken) = >>
  • Samma som Bit Shift left men behåller teckenbiten (MSB biten längst till vänster). 
  • 1110 0000 >> 2 = 1111 1000
  • 0110 0000 >> 2 = 0001 1000

public static void main(String args[]) {

int a = 0b0110;  // 6
int b = 0xE; //14, 1110

System.out.println("~a : " + (~a));

System.out.println("a & b : " + (a & b));

System.out.println("a | b : " + (a | b));

System.out.println("a ^ b : " + (a ^ b));

System.out.println("a << b : " + (a << b));

System.out.println("a >> 2 : " + (a >> 2));

}

Resultat:
~a : -7
a & b : 6
a | b : 14
a ^ b : 8
a << b : 98304
a >> 2 : 1



Inga kommentarer:

Skicka en kommentar