bit vis

Tags:    java

hej

er der nogle som kan forklare hvordan man bruger bitvis opratorer, altså <<, >>, | osv.

på forhånd tak

adam

Køb en zebra - og kald den plet





3 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
hej

er der nogle som kan forklare hvordan man bruger bitvis opratorer, altså <<, >>, | osv.

på forhånd tak

adam

Køb en zebra - og kald den plet



<< skifter bits til venstre. Fylder op med 0'er til højre. Svarer til at gange med 2 for hver bit shiftet. F.eks. er 15 << 2 = 60, idet 15 har bit repræsentationen 1111 som skiftet to pladeser bliver til 111100, som har værdien 0*2^0+0*2^1+1*2^2+1*2^3+1*2^4+1*2^5 = 4+8+16+32 = 60.

Hver opmærksom på at bitsene længst til venstre i bit repræsentationen bliver smidt væk.

Dette har normalt forskellig effekt alt efter om din maskin arkitektur benytter big endian eller little endian, men java er system uafhængig så her er det ikke noget problem.

<< er en signed operation så sign bitten bliver ikke smidt væk, hvilket vil sige at -15 << 2 = -60.

>> skifter bits til højre. Fylder op med 0'er. Svarer til at dele med 2. Signed.

>>> Skifter bits til højre som ovenstående, men unsigned, hvilket betyder at sign bitten ikke bevares. Negative integers i java repræsenteres ved hjælp af 2's complement. Så bit representationen findes på følgende måde. Vælg det tilsvarende positive tal. Tag complementet til hver bit (1->0 og 0->1) og læg 1 til. Da integers i java er på 32 bit har vi 4=100. Complementet er ~4=1...1011 dvs ~4+1=-4 er 1...1100. Skifter vi -4 >>> 1 har vi så 01...101 hvilket er 2^31-2 = 2147483646.

Bemærk at negative tal repræsenteres ved hjælp af bitkompliment for at optimere på beregninger.

&, |, ^, ~ er bitwise and, or, xor og komplement hhv. Hvis X står for en af disse så vil op1 X op2 sammenligne hver bit i op1 og op2 positionsvis, og den tilsvarende bit i resultatet vil blive sat alt efter hvilken X man vælger. Man kan lave en sandhedstabel for hver af operatorene. For & ser den f.eks. sådan ud:

----------------
|bit1|bit2|res|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
----------------

Så & er en hvis og kun hvis bitsene er 1.

Endvidere er | 1 hvis bare en af bitsene er 1, ^ er 1 hvis og kun hvis kun EN af bitsene er 1, endelig er ~ 1 når bitsene er 0 og 0 når bitsene er 1.

Håber det hjalp!


Mvh.,

Jakob Justsen

[Redigeret d. 25/08-03 19:03:04 af Jakob Justsen]



hej

er der nogle som kan forklare hvordan man bruger bitvis opratorer, altså <<, >>, | osv.

på forhånd tak

adam

Køb en zebra - og kald den plet



For at kunne forstå hvad en bitvis operator gør er det vigtigt at vide hvordan et binært tal er opbygget. Binære tal er ligesom "almindelige" tal opbygget vha. et talsystem, hvor basen er 2 istedet for de almindelige 10.

...og hvad betyder det så?

Normale tal er opbygget således,

Fold kodeboks ind/udKode 


Det samme gør sig gældende for binære tal, men eftersom basen er 2 opbygges tallet kun vha. 1 og 0'er istedet for de sædvanlige 0-9, altså

Fold kodeboks ind/udKode 


Et binært heltal (integer) består altså af 32-bit (1 eller 0'er) og er ofte repræsenteret på 2-complement form, hvilket betyder den mest betydende bit (længst til venstre i Java) repræsenterer - 2^31 (eller -2.1247.483.548). Det giver en range på Java's heltal på -2^31 til 2^31-1.

Altså, antager man at nedenstående binære tal er på 2-complement form, så giver det

Fold kodeboks ind/udKode 


Rent faktisk gælder det, at alle 2-complement tal er lig -1 hvis alle dets bit er 1, ligemeget hvor mange bit tallet beståer af! ...prøv evt. at regne lidt på det hvis du ikke tror på mig :o)

Nå, men tilbage til spørgsmålet.

Java har en række bitvise operatorer som gør det muligt at bit-manipulere med dets primitive heltalstyper. Jeg demonstrer kun et lille udsnit herunder, men du fanger nok ideen.

>> (right shift)
Fold kodeboks ind/udKode 


Tilsvarende findes der også en left shift operator, samt endnu en right shift operator som er ikke er fortegnsbevarende.

| (bitvis or)
Fold kodeboks ind/udKode 


Bitvise boolske operatorer fortager altså en boolsk sammenligning mellem de respektive bit. Tilsvarende findes der også bitvis AND, NOT og XOR.

Det var en længere smøre, men jeg håber du blev lidt klogere.


[Redigeret d. 25/08-03 19:14:29 af Erik K. Aarslew-Jensen]



Du kan evt. lege lidt med at skrive bitsrepræsentationen ud for dine integers. Det kan du gøre ved at benytte metoden static String Integer.toBinaryString(int i).

F.eks.
<pre>
public class BitOp {
public static void main(String args[]) {
System.out.println(Integer.toBinaryString(4));
System.out.println(Integer.toBinaryString(~4));
System.out.println(Integer.toBinaryString(-4));
System.out.println(Integer.toBinaryString(-4>>>1));
System.out.println(Integer.toBinaryString(~4+1));
System.out.println(Integer.toBinaryString((~4+1)>>>1));
}
}
</pre>

Mvh.,

Jakob Justsen



t