[fpc-pascal] Why does this work?
Marco van de Voort
marcov at stack.nl
Fri Apr 12 11:55:40 CEST 2013
In our previous episode, Reinier Olislagers said:
> multiple bytes (apparently stored BE: the first field goes into the
> lower byte, the 8th field in the next byte).
> I have a lot of trouble with shr and shl going on. The first line
> seemingly drops the three lower bits... but why?
> ... and some bits are shifted back again in the next line? Arggh!
No, the second takes the remaining 3 bits ( and $7), which is the
bit number inside the byte, and does (1 shl that value) which is like 2 to the power that
value. IOW it changes a bit index to a bit mask.
So the first line calculates the position of a byte from a bit index. The
second takes the remainining bits of the index inside the byte and tests
it. The function returns true if it is false (=0) btw.
> Src := PChar(Src) + FNullField.Offset + (AFieldDef.NullPosition shr 3);
> Result := (PByte(Src)^ and (1 shl (AFieldDef.NullPosition and $7))) = 0;
More information about the fpc-pascal