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".
|
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |