====== Bitioperatsioonid ======
Bitioperatsioonide teek on üldkasutatav makrofunktsioonide kogum tüüpiliste bititehete teostamiseks. Neid funktsioone võib kasutada ükskõik milliste registrite või andmetüüpide puhul, sest makrofunktsioonidel pole kindlat andmetüüpi. Funktsioonid sobivad nii 8-, 16- kui ka 32-bitiste muutujate ning registrite jaoks. Neid bitioperatsioone kasutavad kõik teised teegi osad, seepärast on lähtekoodi alampeatükis funktsioonid ka välja kirjutatud.
Bitiindeksiks loetakse biti järjekorranumbrit, alustades kõige vähemtähtsast (inglise keeles //least significant bit//, lühend LSB). Loendamine algab nullist. 8-bitiste arvude puhul on bitiindeksi väärtus 0-7, 16-bitiste puhul 0-15 ja 32-bitiste puhul 0-31.
===== Funktsioonid =====
* **//bit_mask(bit)//** \\
Bitiindeksi teisendamine bitimaskiks. Parameetrid:
* //bit// - Bitiindeks.
* Tagastab bitimaski.
* **//bit_set(value, bit)//** \\
Muutujas kindla biti kõrgeks seadmine. Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* **//bit_clear(value, bit)//** \\
Muutujas kindla biti madalaks seadmine. Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* **//bit_set_to(value, bit, state)//** \\
Muutujas kindla biti soovitud olekusse seadmine. Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* //state// - Tõeväärtus (//true// või //false//).
* **//bit_invert(value, bit)//** \\
Muutujas kindla biti oleku ümberpööramine (madal kõrgeks ja vastupidi). Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* **//bit_is_set(value, bit)//** \\
Väärtuse kindla biti kõrgeloleku kontroll. Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* Tagastab tõeväärtuse //true//, kui bitt on kõrge ja //false//, kui bitt on madal.
* **//bit_is_clear(value, bit)//** \\
Väärtuse kindla biti madaloleku kontroll. Parameetrid:
* //value// - Muutuja.
* //bit// - Bitiindeks.
* Tagastab tõeväärtuse //true//, kui bitt on madal ja //false//, kui bitt on kõrge.
===== Näide =====
Muutujas //b// kolmanda biti kõrgeks seadmine ja viimase ümberpööramine.
#include
int main(void)
{
unsigned char b = 0x00;
bit_set(b, 2);
bit_invert(b, 7);
}
===== Lähtekood =====
Järgnevalt on lühendatud kujul toodud teegi lähtekood, kust on näha, mis iga makrofunktsiooni taga peitub:
//
// Funktsioonid bittidega tegelemiseks
//
#define bit_mask(bit) (1 << (bit))
#define bit_set(value, bit) value |= bit_mask(bit)
#define bit_clear(value, bit) value &= ~bit_mask(bit)
#define bit_invert(value, bit) value ^= bit_mask(bit)
#define bit_is_set(value, bit) ((value) & (bit_mask(bit)))
#define bit_is_clear(value, bit) (!((value) & (bit_mask(bit))))
#define bit_set_to(v, b, x) v = ((x) ? (v | bit_mask(b)) : (v & ~bit_mask(b)))
//
// Funktsioonid bitimaskidega tegelemiseks
//
#define bitmask_set(value, bitMask) value |= (bitMask)
#define bitmask_clear(value, bitMask) value &= ~(bitMask)
#define bitmask_invert(value, bitMask) value ^= (bitMask)
#define bitmask_set_to(v, m, x) v = ((x) ? (v | (m)) : (v & ~(m)))
#define bitmask_is_set(value, bitMask) ((value) & (bitMask))