在C++中将int中的最低有效位复制到long中



我正试图将int中的8个最低有效位复制到无符号long中的给定位置。我的第一个方法是v1 = (v1 & ~0xf) | (v2 & 0xf);其中v1是long,v2是int。然而,这会在最后复制它,我不知道如何修改它,以便能够将这8位复制到long中的任何位置。谢谢你的帮助!

好吧,这里是您需要的简单函数:

#include <iostream>

void moveAByte( unsigned long int& destinationLong, const int& sourceInt,
const std::size_t destByteOffset, const std::size_t sourceByteOffset )
{
uint8_t* const firstByteAddressOfLong { reinterpret_cast<uint8_t* const>( &destinationLong ) };
const uint8_t* const firstByteAddressOfInt { reinterpret_cast<const uint8_t* const>( &sourceInt ) };
*( firstByteAddressOfLong + destByteOffset ) = *( firstByteAddressOfInt + sourceByteOffset );
}
int main( )
{
unsigned long int v1 { 0x12'34'56'78 }; // a sample number
int v2 { 0x19'ab'cd'ef }; // another sample number
const std::size_t destByteOffset { 3 }; // Here choose between 0, 1, 2 ,3
const std::size_t sourceByteOffset { 0 }; // the same here
std::cout << 'n';
std::cout << "Before copying the byte " << sourceByteOffset << " of v2 to byte " << destByteOffset << " of v1" << "nn"
<< std::showbase << std::hex << "v1 address: " << &v1 << " --> " << "v1 value: " << v1 << 'n'
<< "v2 address: " << &v2 << " --> " << "v2 value: " << v2 << 'n';
std::cout << std::dec << 'n' << "------------------------------------------------------" << "nn";
moveAByte( v1, v2, destByteOffset, sourceByteOffset ); // source byte located in v2 is copied to destination byte located in v1
std::cout << "After copying the byte " << sourceByteOffset << " of v2 to byte " << destByteOffset << " of v1" << "nn"
<< std::showbase << std::hex << "v1 address: " << &v1 << " --> " << "v1 value: " << v1 << 'n'
<< "v2 address: " << &v2 << " --> " << "v2 value: " << v2 << 'n';
return 0;
}

样本输出:


Before copying the byte 0 of v2 to byte 3 of v1
v1 address: 0x8504fffc78 --> v1 value: 0x12345678
v2 address: 0x8504fffc7c --> v2 value: 0x19abcdef
------------------------------------------------------
After copying the byte 0 of v2 to byte 3 of v1
v1 address: 0x8504fffc78 --> v1 value: 0xef345678
v2 address: 0x8504fffc7c --> v2 value: 0x19abcdef

可以看出,在本例中,v2的最低有效字节ef被复制到v1的最高有效字节,该字节曾12,但现在也是ef

使用函数moveAByte,您可以轻松地将v1中的任何字节复制到v2中的任何位置。

注意:此代码仅适用于little-endian机器,而不适用于big-endian机器。

注意:在我的平台(Windows(上,long是4个字节。在macOSLinux上,它是8个字节。因此,如果您使用macOSLinux,请不要忘记考虑这一点。

让我们创建一个位掩码,以便提取8个最低有效位。如果我们计算,那么我们得到255作为我们的比特掩码(11111111(。然后,假设你想把这8位放在第三位,这样我们就可以使用(<<(运算符来转换到我们想要的位置。

long-ans=(long(((var&bitmask(<lt;pos(;

您需要位偏移,请检查此项。基本上,0x1 << 2在数字的右边加两个零,所以它变成0x100或4。相反,0x101 >> 2移除2个最低有效字节,因此它变为0x1

要获得int的8个最低有效字节,您可以按位并使用255(0xFF(,然后根据需要向左移动它们,最后按位或使用长数字:

int v1 = 0xABAB;
unsigned long v2 = 0;
v2 = v2 | ((v1 & 255) << 5); // change 5 to the number you want

最新更新