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 <homelab/bit.h>
 
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))
et/software/homelab/library/bit.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0