Avatar billede dresen Nybegynder
02. juli 2005 - 12:49 Der er 11 kommentarer

java bitwise and shift operators

Hej eksperter

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.

Er der nogen af jer, der kan give nogle guldkorn

på forhånd tak
Avatar billede arne_v Ekspert
02. juli 2005 - 13:01 #1
Avatar billede jakoba Nybegynder
02. juli 2005 - 13:06 #2
&  er  bitwise AND
|  er bitwise OR

int tre = 1 | 2;
int fem = 7 & 13;

<<  er shiftleft operator  (0-bits shiftes ind i højre side)
>>>  er shiftright operator  (0-bits shiftes ind i venste side)

int otte = 1<<3;
int eet  = 4>>>2;

>> er aritmetisk shiftleft, dvs sign bit replikerer

int minus1 = -47>>14;

mvh JakobA
Avatar billede driis Nybegynder
02. juli 2005 - 13:07 #3
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 */ ;
}
Avatar billede sondergard Nybegynder
07. juli 2005 - 21:34 #4
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.

Kan det bruges?
Avatar billede arne_v Ekspert
24. juli 2005 - 15:28 #5
dresen ?
Avatar billede dresen Nybegynder
01. september 2005 - 03:08 #6
Undskyld mange gange.

Jeg blev syg, og så gik mine projekter i stå. Læg venligst et svar, så I kan få jeres andel af pointene.
Avatar billede sondergard Nybegynder
01. september 2005 - 07:55 #7
.
Avatar billede sondergard Nybegynder
01. september 2005 - 07:55 #8
.
Avatar billede jakoba Nybegynder
02. september 2005 - 02:48 #9
ok.
Avatar billede arne_v Ekspert
03. september 2005 - 20:00 #10
medmindre du synes at min artikel var aldeles fremragende så frafalder jeg
Avatar billede trp79 Nybegynder
09. november 2005 - 19:41 #11
lukketid?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester