Code:
void get_crc( unsigned char d )
{
int i;
crc ^= d;
for( i = 8; i; i-- ){
crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
}
}
Wenn ich mich nicht irre:
Delphi-Quellcode:
procedure get_crc(d: char);
var i: integer;
begin
crc := crc xor d;
for i := 8 downto 1 do
if (crc and 1)<>0 then
crc := (crc shr 1) xor $A001
else crc := crc shr 1;
end;
//Edit: Peinlicher Fehler korrigiert
//Edit2:
Erklärung
crc ^= d
ist Kurzform für
crc = crc ^ d
, also XOR.
for( i = 8; i; i-- )
Teil 1+3 dürften klar sein, der mittlere Teil ist impliziter Cast in bool, ergo 0=false, sonst true.
crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
Der Pfeil steht für ein Bitshift, das & für ein AND und die ?:-Schreibweise ist eine Inline-Bedingung. Auch hier wieder impliziter bool-Cast.
//Edit3: Man hätte den Code aber auch kürzer kriegen können:
Code:
void get_crc( unsigned char d )
{
crc ^= d;
for(int i = 8; i; i--)
crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
}
Klammern und Int-Zeile gespart.