Jeg vil gerne analysere en integer, og opbygge en bitstreng.
Udfordringen ligger i at bruge bitwise operators (så kaldet Integer.toBinaryString() er udelukket :)
I et eks. jeg har fundet i en bog, gøres der brug af en bitmask til at sammenligne med den integer der gives. Jeg kan se, at der bruges en shift operator til at isolere en bit til sammenligning, men forstår ikke helt hvordan det gøres.
Ellers et eksempel (anse det som pseudo-kode, har ikke lige testet):
int dinInt = 32154 for(int n = 0 ; n < sizeof(int)*8 ; n++ ) { if ( dinInt & ( 1 << n ) != 0 ) /* bit n var sat i dinInt */ ; else /* bit n var IKKE sat */ ; }
Er det ikke noget i denne stil du har brug for? Den skriver en bit ud ad gangen. Ved at angive en startbit og antallet af bits i tallet, kan den også analysere f.eks. en byte.
public void printBits(int number, int startBit, int numBits) { int bitmask; bitmask = 0x80000000 >>> startBit; for (int i = 0; i < numBits; ++i) { if ( (number & bitmask) == 0) System.out.print('0'); else System.out.print('1'); bitmask >>>= 1; } }
Først rightshiftes bitmasken til den rigtige længde, så den passer med tallet (f.eks. 8 bit for en byte = 10000000). Derefter AND'es tallet med bitmasken, som også rightshiftes hver gang løkken er gennemløbet. Da AND kun giver 1 hvis begge (alle) tal er 1, vil man få analyseret den bit i tallet svarende til 1-tallet i bitmasken (som jo bliver rightshiftet).
For en almindelig integer skal du så bare angive startbit som 0 og numbits som 32.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.