Union shiftet in die falsche Richtung. Bei einem Byte mit 8 Bits ist schlecht mit um 7 Bits nach links zu shiften, die fallen dann gleich mal weg...
Und um den Prozessor nicht unnötig hin- und hershiften zu lassen, nur damit ein paar Bits überfallen, kann man auch gleich maskieren für das letzte Bit:
Delphi-Quellcode:
function CharToBin(AChar : char): string;
var
i: Integer;
begin
SetLength(result, 8);
for i := 1 to 8 do
begin
if (Byte(AChar) shr (8-i)) and 1 = 0 then
result[i] := '0'
else
result[i] := '1';
end;
end;