с++:使用位位置的快速操作
с++: rapid actions with bits positions
有一个任务: 有 2 个数字:
- SRC 通过设置相应的位来指定从 0 到 31 的数字。
- DST 指定在 SRC 中设置的要选择的数字的位置
例如:
src = 0b11010110
- 数字 No1 = 1, No2 = 2, No3 = 4, No4 = 6, No5 = 7
mask = 0b00001010
- 从 src 中提取编号 No1、No3
result = 0b01000100
你能告诉我你能多快做到这一点吗? 我在下面写了代码,但也许你可以做得更好?
int unzip_variant(const int src, const int mask)
{
int unzipped = 0;
int pos = 0;
for (int index = 1; index <= с_size; index ++)
{
if (src & (1 << index))
{
pos += 1;
if (mask & (1 << pos))
unzipped |= (1 << index);
}
}
return unzipped;
}
我希望我正确理解您的问题,并编写了以下解决方案:
// x: value, m: mask, for your dataset: unzip(0xd6, 0xa) -> 0x44
unsigned unzip(unsigned x, unsigned m) {
unsigned bit, mm;
for(mm = 0, bit = 1; bit <= x; bit <<= 1)
if(bit & x)
mm |= bit & m;
else
m <<= 1;
return x & mm;
}
对if
继续条件可能有用的修改:
for(mm = 0, bit = 1; bit <= x && bit != 0; bit <<= 1)
- bit != 0 - 很有用,如果
x
的符号位(最高(也包含数据
实验性地获得了我无法获得的最快代码。
int unzip_variants(
const int numbers,
const int variants
)
{
int unzipped_variants = 0;
int pos = 0;
for (int index = 1; index <= с_size; index++)
{
pos += (variants >> index) & 1;
unzipped_variants |= (((variants >> index) & 1) *
((numbers >> pos) & 1)) << index;
}
// for (int variants_index = 1; variants_index <= с_size; variants_index++)
// {
// if (variants & (1 << variants_index))
// {
// pos += 1;
//
// if (numbers & (1 << pos))
// unzipped_variants |= (1 << variants_index);
// }
// }
return unzipped_variants;
}
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 重载操作程序时出错>>用于类中的字符串 memebr
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- MPI突然停止了对多个核心的操作
- 无法获取webot::PositionSensor对象中位置传感器的值
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- с++:使用位位置的快速操作
- 将字符数复制到新字符串位置的字符串操作,例如 S[0]
- 是否可以在一个语句中执行2个相反的位置操作
- std::list c++是连续的,那么在序列中的任何位置插入和擦除操作都需要恒定的时间
- 是否有任何高性能的C/C++库支持在任意位置进行位操作
- 如果对赋给指针的迭代器进行自增操作,该指针是否保留原始内存位置?
- 使用单个写操作写入多个VA位置