Siirtorekisterin toteutus Javalla
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 Nyt siirtorekisteriin tuodaan bittejä oikealta Esimerkiksi Position 2 uusi arvo on position 7 ja position 1 XOR operaation tulos Eli kun bittejä siirretään niin XOR operaatio edellisen kierroksen arvoista Javalla seuraavasti ((rekisteri & 0x80) >>> 7) ^ ((rekisteri & 0x02) >>> 1);
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 Positio 0: Byte uusi[pituus]; // uusi[0] = 00001111; int maski[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; for (int i=0;i<pituus;i++) { // go through all bytes for (int j=7;j>=0;j--) { // move each bit of byte to register MSB first { // lisää muut positiot ja muu rekisterin käsittely ((rekisteri & 0x80) >>> 7) ^ ((uusi[i] & maski[j]) >>> j); }
CRC koodauksen toteutus siirtorekisterillä Positio 7 6 5 4 3 2 1 Esimerkiksi CRC-8 koodaus http://www.macs.hw.ac.uk/~pjbk/nets/crc/
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 A B C D E F G H Maskataan rekisteristä position 7 bitti ja siirretään (rekisteri & 0x80) >>> 7 Olkoon rekisterissä esim. seuraavat bitit (A - H joko 0 tai 1) rekisteri ABCDEFGH 0x80 10000000 rekisteri & 0x80 A0000000 (rekisteri & 0x80) >>> 7 0000000A
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 A B C D E F G H Maskataan rekisteristä position 1 bitti ja siirretään (rekisteri & 0x02) >>> 1 Rekisterissä samat bitit kuin edellä (A - H joko 0 tai 1) rekisteri ABCDEFGH 0x20 00000010 rekisteri & 0x20 000000G0 (rekisteri & 0x20) >>> 1 0000000G
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 A B C D E F G H XOR operaatio rekisterin positioiden 7 ja 1 bitit välillä ((rekisteri & 0x80) >>> 7) ^ ((rekisteri & 0x02) >>> 1); (rekisteri & 0x80) >>> 7 0000000A (rekisteri & 0x02) >>> 1 0000000G XOR A XOR G Tulos on bitti X 0000000X
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 IJKL… A B C D E F G H Tehdään kaikki XOR operaatiot Tulokset olkoon X, Y ja Z vasemmalta oikealle Siirretään XOR operaation tulokset oikeaan positioon Eli positiot 2, 1 ja 0 X << 2 00000X00 Y << 1 000000Y0 Z (ei tarvitse siirtää) 0000000Z
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 JKL… A B C D E F G H I Siirretään kaikkia bittejä vasemmalle rekisteri = (rekisteri << 1); rekisteri BCDEFGHI
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 JKL… A B C D E F G H I Asetetaan XOR laskujen tulokset oikeille paikoille rekisteri = (rekisteri & ~0x04) | (X << 2); Voisi olla myös ^ operaatio, koska ensin nollataan edellinen arvo rekisteri BCDEFGHI 0x04 00000100 ~0x04 11111011 X << 2 00000X00
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 JKL… A B C D E F G H I rekisteri = (rekisteri & ~0x04) | (X << 2); rekisteri BCDEFGHI ~0x04 11111011 rekisteri & ~0x04 BCDEF0HI rekisteri & ~0x04 BCDEF0HI X << 2 00000X00 (rekisteri & ~0x04) | (X << 2) BCDEFXHI
Siirtorekisteri (CRC-8) Positio 7 6 5 4 3 2 1 JKL… A B C D E F X Y Z Vastaavasti muille XOR operaation tuloksille Y ja Z Ja sitten aloitetaan alusta…