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; _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal