TURBO PASCAL |
Новости
|
60: How do I obtain a bit or bits from a byte, a word or a longint?A: For bit operations think of the variable as a binary number instead of a decimal. Consider for example var x : word; x := 219; In binary presentation it is The word 0000 0000 1101 1011 Position in the word FEDC BA98 7654 3210 Say you need the value of bit 6 (the seventh bit) in the word. You can "and" the following words 0000 0000 1101 1011 (219) 0000 0000 0100 0000 ( 64) In decimal TP notation this amounts to var b : word; b := x and 64; The value of b is now 0000 0000 0100 0000 ( 64) To get the bit value (0 or 1) you need to shift the result right by six steps, that this the expression becomes the often seen but cryptic b := (x and 64) shr 6; which means that the value of b is finally 1 in this example. Ok, but what then if you need the combined value of bits six and seven. The answer is evident if you consider the binary presentation 0000 0000 1101 1011 (219) 0000 0000 1100 0000 (192) hence b := (x and 192) shr 6; which will give 3 as it should. So far, so good. What if you need to turn on bit nine in a word without interfering with the other bits. The binary presentation, again, is the key. You'll have to "or" the following 0000 0000 1101 1011 (219) 0000 0010 0000 0000 (512) that is x := x or 512; This results to 0000 0010 1101 1011 (731) What if you wish to turn off, say bit 6, in 0000 0000 1101 1011 (219) 1111 1111 1011 1111 (65471) This is achieved by x := 219; x := x and 65471; This results to 0000 0000 1001 1011 (155) Consider the following application as an example. The number of a PC's floppy disk drives (minus one) is stored in bits 6 and 7 in a word returned by interrupt $11. This is the code to find out how many disk drives a PC has. uses Dos; function NrOfFDiskDrives : byte; var regs : registers; begin Intr ($11, regs); NrOfFDiskDrives := ((regs.ax and 192) shr 6) + 1; end; A tip from Duncan Murdoch. You might wish to predefine the following constants for easier handling const bit0 = 1; bit1 = 2; bit2 = 4; : bit15 = 32768; : bit31 = 2147483648; Or to put it slightly differently as Dr John Stockton jrs@dclf.npl.co.uk suggests const bit00=$00000001; bit01=$00000002; bit02=$00000004; bit03= $00000008; bit04=$00000010; bit05=$00000020; bit06=$00000040; bit07= $00000080; : bit28=$10000000; bit29=$20000000; bit30=$40000000; bit31= $80000000; Finally, you also might want to look at the item "Getting a nybble from a byte". |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |