Bittioperaatiot ja CRC koodaus (siirtorekisterin toteutus) Javalla

Download Report

Transcript Bittioperaatiot ja CRC koodaus (siirtorekisterin toteutus) Javalla

JYVÄSKYLÄN
YLIOPISTO
Bittioperaatiot Javalla
Yhden bitin asettaminen
Siirtorekisterin toteutus
JYVÄSKYLÄN
YLIOPISTO
Bitin asettaminen arvoon x
Olkoon meillä
int rekisteri = 111; // 01101111 can also be byte or
short, as we use only the 8 lowest bits.
int maski[] =
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/* nyt taulukon indeksiä vastaavalla maskilla
saadaan maskattua indeksiä vastaava bitti tavusta
(oikealta lukien) eli
esim. maski[2] = 0x04 (on binäärinä 00000100) */
int bit = x; // 0 or 1, so in binary 0000000x
2
JYVÄSKYLÄN
YLIOPISTO
Bitin asettaminen arvoon x









int maski[] =
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
JYVÄSKYLÄN
YLIOPISTO
Bitin asettaminen arvoon x
Operaatio jolla bitti 1 voidaan asettaa arvoon 0 (koska
sitä ei voi tehdä suoraan OR operaatiolla) :
rekisteri = (rekisteri & ~maski[2]) | (bit << 2);
 Eli alkuperäinen arvosta ja maskin negaatiosta
otetaan AND operaatio
– Tällä alkuperäinen arvo asetetaan nollaksi

Saadusta tuloksesta sekä asetettavasta bitistä
otetaan OR operaatio
– Bitti siirretään ensin maskin osoittamaan paikkaan
• (bit << 2)
– Ja siis, maski[2] = 0x04 = 00000100 (positio 2 oikealta päin)
4
JYVÄSKYLÄN
YLIOPISTO
Bitin asettaminen arvoon x
Eli maskin negaatio:
~maski[2] = 11111011
And operaatio:
//
rekisteri
// & ~maski[2]
//
AND
01101111
11111011
01101011
5
JYVÄSKYLÄN
YLIOPISTO

Bitin asettaminen arvoon x
Bitin siirto maskin osoittamaan paikkaan
– (bit << 2) eli
– 0000000x ----> 00000x00

Joten
//
(rekisteri & ~maski[2])
// | (bit << 2)
//
A
B
|
0
0
0
0
1
1
1
0
1
1
1
1
OR
01101011
00000x00
01101x11
6
JYVÄSKYLÄN
YLIOPISTO

Javan OR operaatiot
Aikaisemmin meillä on ollut aina 0 toisena tekijänä,
jolloin ei ole väliä kumpaa käyttää
OR

XOR
A
B
|
A
B
^
0
0
0
0
0
0
0
1
1
0
1
1
1
0
1
1
0
1
1
1
1
1
1
0
7
JYVÄSKYLÄN
YLIOPISTO
Positio


Siirtorekisteri (CRC-8)
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
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);
8
JYVÄSKYLÄN
YLIOPISTO
Positio
Siirtorekisteri (CRC-8)
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
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);
}
}
9
JYVÄSKYLÄN
YLIOPISTO
Positio


CRC koodauksen toteutus
siirtorekisterillä
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
Esimerkiksi CRC-8 koodaus
http://www.macs.hw.ac.uk/~pjbk/nets/crc/
10
JYVÄSKYLÄN
YLIOPISTO
Positio

Siirtorekisteri (CRC-8)
7
6
5
4
3
2
1
0
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
11
JYVÄSKYLÄN
YLIOPISTO
Positio

Siirtorekisteri (CRC-8)
7
6
5
4
3
2
1
0
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
12
JYVÄSKYLÄN
YLIOPISTO
Positio

Siirtorekisteri (CRC-8)
7
6
5
4
3
2
1
0
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
13
JYVÄSKYLÄN
YLIOPISTO
Positio
7
6
5
4
3
2
1
0
IJKL…
A

Siirtorekisteri (CRC-8)
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
14
JYVÄSKYLÄN
YLIOPISTO
Positio
A

7
Siirtorekisteri (CRC-8)
6
5
4
3
2
1
0
JKL…
B
C
D
E
F
G
H
I
Siirretään kaikkia bittejä vasemmalle
– rekisteri = (rekisteri << 1);
rekisteri
BCDEFGHI
15
JYVÄSKYLÄN
YLIOPISTO
Positio
A

7
Siirtorekisteri (CRC-8)
6
5
4
3
2
1
0
JKL…
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
16
JYVÄSKYLÄN
YLIOPISTO
7
Positio
A
Siirtorekisteri (CRC-8)
6
5
4
3
2
1
0
JKL…
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
17
JYVÄSKYLÄN
YLIOPISTO
Positio
A


7
Siirtorekisteri (CRC-8)
6
5
4
3
2
1
0
JKL…
B
C
D
E
F
X
Y
Z
Vastaavasti muille XOR operaation tuloksille Y ja Z
Ja sitten aloitetaan alusta…
18