180 likes | 290 Views
Bittioperaatiot Javalla. Yhden bitin asettaminen Siirtorekisterin toteutus. 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};
E N D
Bittioperaatiot Javalla Yhden bitin asettaminen Siirtorekisterin toteutus
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
Bitin asettaminen arvoon x • int maski[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; • 00000001 • 00000010 • 00000100 • 00001000 • 00010000 • 00100000 • 01000000 • 10000000
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)
Bitin asettaminen arvoon x Eli maskin negaatio: ~maski[2] = 11111011 And operaatio: // rekisteri 01101111 // & ~maski[2] AND 11111011 // 01101011
Bitin asettaminen arvoon x • Bitin siirto maskin osoittamaan paikkaan • (bit << 2) eli • 0000000x ----> 00000x00 • Joten // (rekisteri & ~maski[2]) 01101011 // | (bit << 2) OR 00000x00 // 01101x11
Javan OR operaatiot • Aikaisemmin meillä on ollut aina 0 toisena tekijänä, jolloin ei ole väliä kumpaa käyttää • OR XOR
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio 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);
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio 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); } }
CRC koodauksen toteutus siirtorekisterillä • Esimerkiksi CRC-8 koodaus • http://www.macs.hw.ac.uk/~pjbk/nets/crc/ 7 6 5 4 3 2 1 0 Positio 0 0 0 0 0 0 0 0
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio A C D B 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)
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio A C D B 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)
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio A C D B E F G H • XOR operaatio rekisterin positioiden 7 ja 1 bitit välillä • ((rekisteri & 0x80) >>> 7) ^ ((rekisteri & 0x02) >>> 1);
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio IJKL… A C D B 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
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio JKL… A B D E C F G H I • Siirretään kaikkia bittejä vasemmalle • rekisteri = (rekisteri << 1);
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio JKL… A B D E C 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
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio JKL… A B D E C F G H I • rekisteri = (rekisteri & ~0x04) | (X << 2);
Siirtorekisteri (CRC-8) 7 6 5 4 3 2 1 0 Positio JKL… A B D E C F X Y Z • Vastaavasti muille XOR operaation tuloksille Y ja Z • Ja sitten aloitetaan alusta…