====== 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))