TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

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".
 

 Contents

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz