0

I intend to write a function which accepts two numbers and concatenates their binary values such that:

resultingNumber=(number1)|(number2)

Here i need ((number1) << num_bits_in_2) |(number2). i.e. number2 should occupy the lowest bits. Number1 should occupy the higher bits and should not overlap with bits of maxnumber2

func(number1, number2, maxnumber1, maxnumber2)
{
    long rem,i=1,binaryMaxNumber1=0,binaryMaxNumber2=0, lenNumber1=0, lenNumber2=0;
    do
    {
        rem=maxNumber1%2;
        binaryMaxNumber1=binaryMaxNumber1 + (i*rem);
        lenNumber1++;
        maxNumber1=maxNumber1/2;
        i=i*10;
    }while(maxNumber1>0);

    i=1;
    do
    {
        rem=maxNumber2%2;
        binaryMaxNumber2=binaryMaxNumber2 + (i*rem);
        lenNumber2++;
        maxNumber2=maxNumber2/2;
        i=i*10;
    }while(maxNumber2>0);

    unsigned resultingNumber=(number1<<lenNumber2)|(number2);
}

I wrote the above mentioned program in order to get the desired results. Is there any other way which is more efficient than this to achieve the same in C/c++. As I need to call this function again and again for very large numbers.

user3809749
  • 129
  • 1
  • 6

2 Answers2

3

Assuming your codes is correct your function can be rewritten like this:

unsigned long func( unsigned long number1, unsigned long number2, unsigned long , unsigned long maxnumber2)
{
    while( maxnumber2 ) {
        maxnumber2 >>= 1;
        number1 <<= 1;
    }
    return number1 | number2;
}

But if you use the same maxnumber2 it would be better to count number of bits to shift outside of the function and pass that instead of maxnumber.

Slava
  • 43,454
  • 1
  • 47
  • 90
1

You can use _BitScanReverse intrinsic to quickly find the number of bits for number2.

long long func( long number1, long number2)
{
    unsigned long numBits = 0;
    if( _BitScanReverse(&numBits, (unsigned)number1))
    {
        return (long long)(number1<<numBits)|number2;
    }
    return (long long)number2;
}

Note that the size of the resulting number should be big enough to contain the other numbers.

rashmatash
  • 1,699
  • 13
  • 23
  • number of bits in `maxnumber2` not `number2`. And where did OP say that this is (only) for MS VS? – Slava Jul 31 '14 at 15:44