我打算编写一个函数,它接受两个数字并连接它们的二进制值,以便:
resultingNumber =(数量1)|(数字2)
这里我需要((number1)<< num_bits_in_2)|(number2)。即number2应占用最低位。 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 ++中实现相同的方法。因为我需要一次又一次地调用这个函数非常大的数字。
答案 0 :(得分:3)
假设您的代码是正确的,您的功能可以像这样重写:
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。
答案 1 :(得分:1)
您可以使用_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;
}
请注意,结果数字的大小应足够大,以包含其他数字。