Thread: Bitwise Operations to Read ON/OFF Bits

  1. #1
    Registered User
    Join Date
    Feb 2008
    Posts
    10

    Question Bitwise Operations to Read ON/OFF Bits

    Hey,
    I am new to C, and I'm stack on code for bitwise operation

    I need to get a function (which i have a call from main) using 3 integers to say if bits in a range are all on or off

    function(Number,X,Y)

    where:
    Number , is the integer
    X is the beginning position of the range
    Y is the ending position of the range

    so far the only solution that i thought of was:

    (((Number >> X) & 01) & ((Number >> Y) & 01))

    but it doesnt seem to work.
    Anyone able to help me?

  2. #2
    Hurry Slowly vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,788
    one of the solutions - write function that checks that left n bits are all ON using bitmask tables

    Code:
    unsigned char check[] = { 0x01, 0x03, 0x07, ...};
    
    int checkLeftBits(unsigned char value, size_t numberOfBits)
    {
       unsigned char cleardValue = value & check[numberOfBits-1]; /* clear bits that are out of interest */
       return (cleardValue  == check[numberOfBits-1]);
    }
    of course this sample lacks checks for suitable range of the second parameter which should be from 1 to CHAR_BITS

    the second step will be to take the original value, shift it on X bits left and based on Y-X value - decide what bytes of the number should be passed into the function above with what number of bits too check)
    All problems in computer science can be solved by another level of indirection,
    except for the problem of too many layers of indirection.
    – David J. Wheeler

  3. #3
    Algorithm Dissector iMalc's Avatar
    Join Date
    Dec 2005
    Location
    New Zealand
    Posts
    6,318
    Lets have an example:
    Number is 0011001101011100
    X = 3
    Y = 11
    I'm starting at zero as the rightmost binary digit. You didn't give the conventions so I'll make my own. The mask we want is:
    0000111111111000

    How can we make this mask? Well...
    1<<3 == 0000000000001000
    1<<11 == 0000100000000000

    Now subtract one from those:
    0000000000000111
    0000011111111111

    Can you now see how we can get the mask using 'xor', and then solve the problem using an 'and'?
    My homepage
    Advice: Take only as directed - If symptoms persist, please see your debugger

    Linus Torvalds: "But it clearly is the only right way. The fact that everybody else does it some other way only means that they are wrong"

  4. #4
    Woof, woof! zacs7's Avatar
    Join Date
    Mar 2007
    Location
    Australia
    Posts
    3,459

  5. #5
    Registered User
    Join Date
    Feb 2008
    Posts
    10
    Thanks all for the replies, I managed to figure it out with iMalc's help, and it works. Thanks for the help

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Bitwise Operators
    By rrc55 in forum C Programming
    Replies: 6
    Last Post: 04-30-2009, 11:37 AM
  2. SDLKey to ASCII without unicode support?
    By zacs7 in forum Game Programming
    Replies: 6
    Last Post: 10-07-2007, 03:03 AM
  3. bitwise negation problem
    By Mr_Jack in forum C++ Programming
    Replies: 4
    Last Post: 03-15-2004, 08:16 PM
  4. read bit's from any file
    By scrapedbr in forum C Programming
    Replies: 1
    Last Post: 09-30-2003, 03:12 PM
  5. Serial Communications in C
    By ExDigit in forum Windows Programming
    Replies: 7
    Last Post: 01-09-2002, 10:52 AM