Drexel dragonThe Math ForumDonate to the Math Forum

Ask Dr. Math - Questions and Answers from our Archives
_____________________________________________
Associated Topics || Dr. Math Home || Search Dr. Math
_____________________________________________

System-Level Programming and Base 2


Date: 05/03/2001 at 17:47:57
From: Eric Brasher
Subject: Working with exponents with base of 2

I am starting to learn computer programming and have run into a 
problem. 

I have a result that contains serveral values. But the values are 
always a power of 2 (2^2, 2^3, 2^4).

Say my value is 2^3, 2^4, 2^6   "304"

How can I tell if 2^3 exists in "304" ?
Remember that the value is always sums of the power of 2. There can 
be any number of sums calculated, but usually only 3 to 7.

This is dealing with the status of logon accounts to a server.
   if the account is disabled then the value = 2^1
   if the account is locked out then the value = 2^3
   if the account can not change its password then value = 2^5
   if the account is normal then value = 2^7

So if I query the value and the account is disabled, normal, and 
locked, then the value is 530. I only want to know if the account is 
locked (value = 16), so how do I run a formula to find if 2^3 is one 
of the values in 528?


Date: 05/04/2001 at 14:08:43
From: Doctor TWE
Subject: Re: working with exponents with base of 2

Hi Eric - thanks for writing to Dr. Math.

I'm not sure how you're getting the values 304, 530 or 528.

      2^3 + 2^4 + 2^6 = 8 + 16 + 64 =  88
      2^1 + 2^7 + 2^3 = 2 + 128 + 8 = 138
     (dis) (nrm) (lck)

Powers of 2 are simply the "place values" (or weights) in the binary 
number system. Are you familiar with binary? You really should be if 
you want to do this type of "system level" programming. If you're not 
familiar with binary, you can start by checking out our Number Bases 
FAQ at:

   http://mathforum.org/dr.math/faq/faq.bases.html   

For the following explanation, you should also be familiar with the 
AND logic operation. If you're not familiar with it, see:

   Truth Tables of Boolean Variables
   http://mathforum.org/dr.math/problems/green.03.09.01.html   

   Truth Tables and Computer Circuits
   http://mathforum.org/dr.math/problems/vanetten.1.17.00.html   

The following archive entry explains the "bitwise" operation. Although 
it uses the XOR operation instead of the AND operation, the concept 
applies to the AND operation as well:

   . XOR Operation
   http://mathforum.org/dr.math/problems/james.01.23.01.html   )


What you need is a "masking function" that isolates one bit in the 
account status byte. The account status byte as you describe it looks 
like this:

   2^7  2^6  2^5  2^4  2^3  2^2  2^1  2^0
   128   64   32   16   8    4    2    1
   ---  ---  ---  ---  ---  ---  ---  ---
    X    X    X    X    X    X    X    X   (base 2)
    ^         ^         ^         ^
     \         \         \         \______ Account disabled
      \         \         \_______________ Account locked out
       \         \________________________ Acct can't change password
        \_________________________________ Account is normal

Masking functions are more easily done using logic operations than by 
arithmetic operations. To check whether a particular bit is set ("on") 
or cleared ("off"), AND the byte with a mask byte created as follows: 
place a 1 in the bit position to be tested, and place 0's in all other 
bit positions.

For example, suppose I want to see whether an account is locked out. I 
construct my mask byte by placing a 1 in the 2^3 = 8 bit position and 
0's in the rest of the bits. So my mask byte is:

     2^7  2^6  2^5  2^4  2^3  2^2  2^1  2^0
     128   64   32   16   8    4    2    1
     ---  ---  ---  ---  ---  ---  ---  ---
      0    0    0    0    1    0    0    0   (base 2) = 8 (base 10)

Now I AND this value with the account status byte. Suppose the account 
status byte is 00101011 (base 2) = 43 (base 10). The AND masking 
operation would do:

        Binary     Dec
       00101011  =  43   (Account status byte)
     ^ 00001000  =   8   (Mask byte)
       --------    ---
       00001000      8   (Result)

If the result is 0, the bit under test is cleared (0), but if the 
result is not equal to 0, the bit under test is set (1). In our 
example, the result of 8 is not equal to 0, so the "locked out" bit is 
set in the account status byte.

Suppose, on the other hand, that the account status byte is 11100010 
(base 2) = 226 (base 10). The AND masking operation would do:

        Binary     Dec
       11100010  = 226   (Account status byte)
     ^ 00001000  =   8   (Mask byte)
       --------    ---
       00000000      0   (Result)

Since the result is 0, the "locked out" bit is set in the account 
status byte is cleared.

Most programming languages allow you to use logic operations like the 
AND operation, and some even allow you to specify your mask byte in 
binary (or hexadecimal) instead of having to convert it to decimal. 
Attempting to do this using arithmetic operations requires several 
steps that "strip off" the higher order bits, then check to see if the 
result of dividing the remaining value by 2^n is greater than or equal 
to 1, which is much messier.

I hope this helps. If you have any more questions, write back.

- Doctor TWE, The Math Forum
  http://mathforum.org/dr.math/   
    
Associated Topics:
College Discrete Math
College Number Theory
High School Calculators, Computers
High School Discrete Mathematics
High School Number Theory

Search the Dr. Math Library:


Find items containing (put spaces between keywords):
 
Click only once for faster results:

[ Choose "whole words" when searching for a word like age.]

all keywords, in any order at least one, that exact phrase
parts of words whole words

Submit your own question to Dr. Math

[Privacy Policy] [Terms of Use]

_____________________________________
Math Forum Home || Math Library || Quick Reference || Math Forum Search
_____________________________________

Ask Dr. MathTM
© 1994-2013 The Math Forum
http://mathforum.org/dr.math/