两个数字按位连接

Bitwise concatenation of two numbers

本文关键字:连接 数字 两个      更新时间:2023-10-16

我打算写一个函数,它接受两个数字并将它们的二进制值连接起来,这样:

resultingNumber = (number1) |(科学)

这里我需要((number1) <<num_bits_in_2) |(科学)。即数字2应该占据最低位。Number1应该占用较高的位,并且不应该与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);
}
为了得到想要的结果,我编写了上面提到的程序。在C/c++中,是否有比这更有效的方法来实现相同的目标?对于非常大的数字,我需要一次又一次地调用这个函数

假设你的代码是正确的,你的函数可以这样重写:

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

但是如果您使用相同的maxnumber2,则最好计数要移出函数的位数并传递该位数而不是maxnumber。

您可以使用_BitScanReverse内禀来快速查找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;
}

请注意,结果数字的大小应该足够大,以容纳其他数字。