在 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,您提到您想将位从一种整数类型复制到另一种,但后来您说v1
是float
。是哪个?
你知道如何使用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 个字节。在 macOS 和 Linux 上它是 8 个字节。因此,如果您使用的是 macOS 或 Linux,请不要忘记考虑这一点。
【讨论】:
【参考方案2】:位移是你需要的,检查this。
基本上,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
【讨论】:
【参考方案3】:让我们创建一个位掩码,以便我们可以提取 8 个最低有效位。如果我们计算,那么我们得到 255 作为我们的位掩码(11111111)。 然后,假设你想把这 8 位放在第三位,所以我们可以使用 (
long ans=(long)((var&bitmask)
【讨论】:
以上是关于在 C++ 中将最低有效位从 int 复制到 long的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中将数组 char 复制到字符串或 int* (void *) 中? [关闭]
如何在 int 中找到最低有效位 (LSB) 的位置? C++