x bits uit een bitstream halen
23 september 2009 Plaats een reactie
Ik was bezig met ethernetframes aan het decoderen tot ik mij plots het volgende afvroeg: kan ik de derde en vierde bit van een byte lezen en hoe? Ik weet dat er in de programmeertalen bitwise operators bestaan. Stel dat ik een stream heb van 12 bits en bit 6,7,8 en 9 wil lezen (vier bits dus vanaf positie 6 en positie 1 is uiterst rechts). Het volgende stelt die 12 bits stream voor. De vetgedrukte bits zijn degene die ik wil uitlezen.
0100 0011 1001 (hex: 0x439)
Eerst gaan we de bits rechts wegdoen tot we de eerste bit op positie 6 hebben. Dus de eerste 5 bits vliegen weg.
0100 0011 1001 >> 5 geeft 0100 001 (1)
In een tussenresultaat shift ik de bits weg die ik wil uitlezen en vervang ze door nullen. Dat geeft het volgende tussenresultaat.
0100 001 >> 4 << 4 geeft 0100 000 (2)
Dan trek ik (2) van (1) en bekom ik het getal dat die vier bits voorstelt.
0100 001 – 0100 000 = 0000 0001
Eigenlijk zouden die eerste twee bits nog weg moeten maar dit is onrelevant aangezien we ons resultaat hebben.
Nog een voorbeeldje van bits shiften om te kijken of de derde bit van een gelezen byte gelijk is aan 1 (bv om een flag te controleren).
01011101
01011101 >> 2 geeft 010111 en we gaan die ‘ennen’ met 000001 en dat geeft dan ofwel 1 ofwel 0 als resultaat. In één bewerking kan je een vlag als volgt controleren.
(01011101 >> 2) & 1