Search code examples
cbit-manipulationbitmasktilde

How do you use bitwise operators, masks, to find if a number is a multiple of another number?


So I have been told that this can be done and that bitwise operations and masks can be very useful but I must be missing something in how they work.

I am trying to calculate whether a number, say x, is a multiple of y. If x is a multiple of y great end of story, otherwise I want to increase x to reach the closest multiple of y that is greater than x (so that all of x fits in the result). I have just started learning C and am having difficulty understanding some of these tasks.

Here is what I have tried but when I input numbers such as 5, 9, or 24 I get the following respectively: 0, 4, 4.

    if(x&(y-1)){ //if not 0 then multiple of y
        x = x&~(y-1) + y;
    }

Any explanations, examples of the math that is occurring behind the scenes, are greatly appreciated.

EDIT: So to clarify, I somewhat understand the shifting of bits to get whether an item is a multiple. (As was explained in a reply 10100 is a multiple of 101 as it is just shifted over). If I have the number 16, which is 10000, its complement is 01111. How would I use this complement to see if an item is a multiple of 16? Also can someone give a numerical explanation of the code given above? Showing this may help me understand why it does not work. Once I understand why it does not work I will be able to problem solve on my own I believe.


Solution

  • In the trivial cases, every number that is an even multiple of a power of 2 is just shifted to the left (this doesn't apply when possibly altering the sign bit)

    For example

    10100
    

    is 4 times

    101
    

    and 10100

    is 2 time

    1010
    

    As for other multiples, they would have to be found by combining the outputs of two shifts. You might want to look up some primitive means of computer division, where division looks roughly like

    x = a / b
    

    implemented like

    buffer = a
    while a is bigger than b; do
      yes: subtract a from b
           add 1 to x
    done
    

    faster routines try to figure out higher level place values first, skipping lots of subtractions. All of these routine can be done bitwise; but it is a big pain. In the ALU these routines are done bitwise. Might want to look up a digital logic design book for more ideas.