programmera.net -> java -> normal     för utskrift      info@programmera.net

Binära operatorer

1. Binära operatorer
2. Skifningar och logik
3. Jämföra boolean binärt

1. Binära operatorer

I nedanstående tabell listas alla binära operatorer i Java. Varje operator har en prioritet. Det innebär att man inte behöver använda så många paranteser.

Operator Prioritet Beskrivning
~  1  Binärt ICKE (alla bitar byter värde)
<<  4  Skifta till vänster
>>  4  Skifta till höger (behåll eventuell 1)
>>>  4  Skifta till höger (fyll med 0)
&  7  Binärt OCH
^  8  Binärt XELLER
|  9  Binärt ELLER
op=  13  Tilldelning med någon operator (op står för någon operator <<,>>,>>>,&,^,|)

2. Skifningar och logik

Binära beräkningar innebär att man tolkar en t.ex. int som en 32 bitars binärsträng (innehållande ettor och nollor). Vid t.ex. vänsterskift flyttar man alla ettorna och nollorna ett steg åt vänster. Positionen längst till höger (den minst signifikanta biten) får värdet noll. Med följande program kan man ge två heltal som tolkas som binärsträngar och beräkningar utförs på dem:
class TestBinary{
  public static void main(String[] args){
  if(args.length<2){
    	System.out.println("Two integers expected!");
	System.exit(1);
    }	  
    int a=Integer.parseInt(args[0]);
    int b=Integer.parseInt(args[1]);
    System.out.println("a="+Integer.toBinaryString(a));
    System.out.println("b="+Integer.toBinaryString(b));
    System.out.println("NOT a="+Integer.toBinaryString(~a));
    System.out.println("NOT b="+Integer.toBinaryString(~b));
    System.out.println("NOT a (int)="+(~a));
    System.out.println("NOT b (int)="+(~b));
    System.out.println("a << b="+Integer.toBinaryString(a<<b));
    System.out.println("a >> b="+Integer.toBinaryString(a>>b));
    System.out.println("a >>> b="+Integer.toBinaryString(a>>>b));
    System.out.println("~a >> b= "+Integer.toBinaryString(~a>>b));
    System.out.println("~a >>> b="+Integer.toBinaryString(~a>>>b));
    System.out.println("a AND b="+Integer.toBinaryString(a&b));
    System.out.println("a XOR b="+Integer.toBinaryString(a^b));
    System.out.println("a OR b="+Integer.toBinaryString(a|b));
  }
} 
Vid en testkörning får vi följande:
[olle@dev1]$ java TestBinary 7 2
a=111
b=10
NOT a=11111111111111111111111111111000
NOT b=11111111111111111111111111111101
NOT a (int)=-8
NOT b (int)=-3
a << b=11100
a >> b=1
a >>> b=1
~a >> b =11111111111111111111111111111110
~a >>> b=00111111111111111111111111111110
a AND b=10
a XOR b=101
a OR b=111
Så långt allt frid och fröjd, men vad händer när vi försöker skifta med ett negativt tal?
[olle@dev1]$ java TestBinary 7 -1
a=111
b=11111111111111111111111111111111
NOT a=11111111111111111111111111111000
NOT b=0
NOT a (int)=-8
NOT b (int)=0
a << b=10000000000000000000000000000000
a >> b=0
a >>> b=0
~a >> b =11111111111111111111111111111111
~a >>> b=1
a AND b=111
a XOR b=11111111111111111111111111111000
a OR b=11111111111111111111111111111111
Vi ser att en skiftning med -1 innebär 31 skiftningar. Faktum är att för typen int används bara de 4 minst signifikanta bitarna för att avgöra hur många skiftningar som ska göras. För -1 är dessa bitar 1111 som betyder 31 (med basen 10). Alltså är 31 skiftningar det maximala antalet skiftningar som kan utföras på en int.

3. Jämföra boolean binärt

Det går att jämföra typen boolean med de binära operatorerna:
class TestBinary2{
  public boolean print(String s){
    System.out.println(s);
    return true;
  }
  public static void main(String[] args){
    boolean b=true;
    TestBinary2 t=new TestBinary2();
    if(b | t.print("binary"))  System.out.println("1");
    if(b || t.print("logical"))  System.out.println("2");
  }
}
Programmet ger följande utskrift:
[olle@dev1]$ java TestBinary2
binary
1
2
Som vi ser anropas aldrig metoden print i det fallet då vi använder logiskt ELLER, testet avbryts om vänster operand är true. Så fungerar inte binärt ELLER, trots att vi vet att uttrycket är true så fortsätter JVM att beräkna höger operand. Det är alltså mer effektivt att använda de logiska operatorerna till tester.