Toon posts:

[java] bit code die ik niet helemaal snap

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een java programma onder ogen die ik verder helemaal snap op deze regel na:
code:
1
2
int bytes4 = data.getElementData(i);
b = (byte)((bytes4 & 0x0000FF00) >> 8);


Dit is mij duidelijk:
casting naar byte (evaluatie van de bits met de & operator) en dan jah...
Ik snap de regel niet echt, maar werken doet deze wel, ik snap >> wel (shift naar rechts 8 plaatsen) maar dan valt deze toch buiten het bereik, of komen de bitjes aan de andere kant er weer bij ?

Verder staat er nog onder :
code:
1
2
if(b == 0) break;
tmp[length] = b;


en verder opgevolgd door de zelfde regel alleen dan is 8, 16 of 24 ... met het zelfde if statement er onder.

Klopt toch niet ? dan wordt het toch altijd 0 ? (24 opschuiven terwijl je maar 8 plaatsen hebt :?

FYI: het is een regel uit een programma om direct met hardware te praten in een embedded omgeving. (8>

[ Voor 0% gewijzigd door drm op 17-10-2002 15:07 . Reden: code tags roelen ;) ]


Verwijderd

Topicstarter
b = (byte)((bytes4 & 0x0000FF00) >> 8);
moet zijn:
b = (byte)((bytes4 & 0x0000FF00) >> 8 ) ;

Verwijderd

Let op het: Die shift naar rechts is een DELING door 256.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Idd 1 positie naar rechts shiften is delen door 2 en dan door 4 etc.
Hmm lijkt mij nogal een nutteloze shift, want dan zou er in dit geval toch altijd 0 uit komen omdat je de bits helemaal uit de byte shift

It’s nice to be important but it’s more important to be nice


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 11-06 11:16
je int is 32-bits. Daarom heet ie ook bytes4 (4x8 = 32! :) )
Op dit 32 bits getal wordt de & operator en de shift toegepast. Daarom kun je nog wel bits shiften zonder problemen.
0000FF00 = 4 x byte and. Dus er wordt ge-and op de derde byte van het getal.

[ Voor 0% gewijzigd door Donderwolk op 17-10-2002 15:06 . Reden: meer info toevoegen ]

Pwnd


Verwijderd

Topicstarter
Aaaaaah tuuurlijk
de cast is pas daarna! dan kan het wel 1 byte zijn
_/-\o_

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Plonz:
Let op het: Die shift naar rechts is een DELING door 256.

da's leuk, maar wat maakt dat uit :? Dit is pure bitneukerij. Dat dat dan toevallig een deling door 256 is, boeit imo weinig :)
JonkieXL:
Hmm lijkt mij nogal een nutteloze shift, want dan zou er in dit geval toch altijd 0 uit komen omdat je de bits helemaal uit de byte shift
Nee. 't is geen byte, en je shift 8 bits naar rechts, dus de byte die je uit de int 'and', die komt helemaal rechts te staan.

dit is feitelijk wat er gebeurt:
code:
1
2
3
4
bytes4 = 0x12345678;         // bijvoorbeeld
x = 0x12345678 & 0x0000ff00; // x == 0x00005600;
x >>= 8;                     // x == 0x00000056;
b = (byte) x;                // b == 0x56;

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Yep you're right
Volgens mij filtert deze code gewoon de afzonderlijke bytes uit een 32 bit getal.

It’s nice to be important but it’s more important to be nice


Verwijderd

Topicstarter
Yep, ik dank allen voor de uitleg!
Nu vat ik um iig en kan ik weer verder

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

dit komt me erg bekend voor, ik ben zelf druk in de weer geweest met efficiente opslag en compressie, dan krijg je ook met die soort dingen te maken. :)

LOL

Maar het antwoord staat er al, ik zal me dus stil houden :)

If you are not wiping out you are nog pushing enough...

Pagina: 1