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

Posted

技术标签:

【中文标题】在 C++ 中将最低有效位从 int 复制到 long【英文标题】:Copy least most significant bits from an int to a long in C++ 【发布时间】:2022-01-14 10:49:47 【问题描述】:

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

【问题讨论】:

阅读bit shifting。 Akari,您提到您想将位从一种整数类型复制到另一种,但后来您说v1float。是哪个? 你知道如何使用operator<< 来移动位吗?另外,我不知道你在用 float 做什么,但我不喜欢它。 如果我想在 long 变量中保持其余位不变,我还能使用移位吗?关于 float 它是一种类型,我的意思是 long 请注意:0xf 对应 4 位,而不是 8。 【参考方案1】:

嗯,这是你需要的简单函数:

#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" << "\n\n"
              << std::showbase << std::hex << "v1 address: " << &v1 << " --> " << "v1 value: " << v1 << '\n'
                                           << "v2 address: " << &v2 << " --> " << "v2 value: " << v2 << '\n';

    std::cout << std::dec << '\n' << "------------------------------------------------------" << "\n\n";

    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" << "\n\n"
              << 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,请不要忘记考虑这一点。

【讨论】:

【参考方案2】:

位移是你需要的,检查this。 基本上,0x1 &lt;&lt; 2 在数字的右侧添加两个零,因此它变为0x100 或 4。相反,0x101 &gt;&gt; 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

【讨论】:

【参考方案3】:

让我们创建一个位掩码,以便我们可以提取 8 个最低有效位。如果我们计算,那么我们得到 255 作为我们的位掩码(11111111)。 然后,假设你想把这 8 位放在第三位,所以我们可以使用 (

long ans=(long)((var&bitmask)

【讨论】:

以上是关于在 C++ 中将最低有效位从 int 复制到 long的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将数组 char 复制到字符串或 int* (void *) 中? [关闭]

如何在 C++ 中将 int 附加到字符串? [复制]

如何在 int 中找到最低有效位 (LSB) 的位置? C++

如何在 C++ 中将值 char 数组的类型更改为 int? [复制]

如何在 C++ 中将两个向量复制到另一个向量

将 n 位从 8 位数组复制到 64 位整数?