Bit Shifting

 BBS: Inland Empire Archive
Date: 04-18-92 (09:24)             Number: 126
From: MATT HART                    Refer#: NONE
  To: MELVIN PARKER                 Recvd: NO  
Subj: Bit Shifting                   Conf: (2) Quik_Bas
 MP> Does anyone know how to shift bits right or left using qbasic or MS
 MP> Basic 7.0?  I want to do this without calling another language.

In my prior message - I was telling Daryl about prototyping
in BASIC then converting to assembly - and one of those
things was a bit shifting routine to properly align left
justified fonts to the screen bitmap.  I had to shift bits
to do it.

     Here's one : shift left:

     A$ = " "
     Segment = VARSEG(A$)
     Offset  = PEEK(VARPTR(A$)+2)

     A% = 255
     Segment = VARSEG(A%)
     Offset  = VARPTR(A%)

SUB ShiftLeft(Segment,Offset,NumBits)
     DEF SEG = Segment
     Z = PEEK(Offset)
     DEF SEG
     FOR i = 1 TO NumBits
          A = (((64 AND Z) = 64) AND 128) +_
              (((32 AND Z) = 32) AND 64)  +_
              (((16 AND Z) = 16) AND 32)  +_
              (((8  AND Z) = 8)  AND 16)  +_
              (((4  AND Z) = 4)  AND 8)   +_
              (((2  AND Z) = 2)  AND 4)   +_
              (((1  AND Z) = 1)  AND 2)
          Z = A
     NEXT
     DEF SEG = Segment
     POKE Offset,Z
END SUB

     Now the explanation:  the boolean expressions test the bits and return
either -1 (a number with ALL bits set) or 0 (no bits set).
Then ANDing this result with the new bit to set will either
result in a bit set (if the boolean was -1) or not set (if
0).  Example, if Z was equal to 68, then here's the bit
pattern:
     01000100
Now the expression:
     64 AND Z
will return 64 since bit 7 is set.

Continuing,
     (64 AND Z) = 64
will return TRUE, since 64 AND Z returns 64.  True is -1,
which has the bit pattern 11111111 (actually 16, but 8 here
for simplicity).

Now the rest of the expression:
     (((64 AND Z) = 64) AND 128)
The added AND 128 will return 128, since bit 8 is set in -
1.  This effectively shifts bit 7 to bit 8.  To shift TWO
bits at a time, you can:

     A = (((32 AND Z) = 32) AND 128)

This shifts bit 6 (32) to bit 8 (128).  To shift left:

     A = (((128 AND Z)=128) AND 64)
1 bit to the right.




---
 * Origin: Midnight Micro!  V.32/REL  (918)451-3306 (1:170/600)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET