Here some examples of 16 bit CRC-code generators.
The start-value is important: start with 0xFFFF and you have the CCITT version of CRC-16, start with 0x0000 and you have the CRC-16 as used in the XMODEM data-transfer protocol.
There are a lot of different CRC-standards. They all have the same principle but differ in details. This is not relevant when using it for yourself, but finding the correct version for existing protocol is not always easy.
For an example of a very specific way of using a CRC-code, see the CRC16 for NRF24.
The generic Forth version should run on all Forth implementations.
hex 1021 CONSTANT crc-polynomial ( CCITT ) : crc16 ( n ch--n) 8 lshift XOR 8 0 DO DUP 8000 AND IF \ msb = '1'? 2* FFFF AND \ needed for systems with > 16 bits crc-polynomial XOR ELSE 2* THEN LOOP ; : tst ffff \ start-value f0 crc16 f0 crc16 f0 crc16 f0 crc16 05 crc16 0d crc16 15 crc16 02 crc16 84 crc16 . ;