C++ С++:带位位置的快速动作
有一项任务: 有两个数字: src通过设置相应的位来指定从0到31的数字。 dst指定要选择的src中设置的数字的位置 例如: src=0b11010110-编号№1 = 1, №2 = 2, №3 = 4, №4 = 6, №5=7 掩码=0b00001010-提取数字№1.№3来自src 结果=0B01000000 你能告诉我你能多快完成吗? 我写了下面的代码,但也许你可以做得更好C++ С++:带位位置的快速动作,c++,algorithm,c++11,bit-manipulation,bit,C++,Algorithm,C++11,Bit Manipulation,Bit,有一项任务: 有两个数字: src通过设置相应的位来指定从0到31的数字。 dst指定要选择的src中设置的数字的位置 例如: src=0b11010110-编号№1 = 1, №2 = 2, №3 = 4, №4 = 6, №5=7 掩码=0b00001010-提取数字№1.№3来自src 结果=0B01000000 你能告诉我你能多快完成吗? 我写了下面的代码,但也许你可以做得更好 int unzip_variant(const int src, const int mask) {
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;
}
比特!=如果x的最高符号位也包含数据,则0-非常有用
通过实验获得了最快的代码,我的速度再快不过了
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;
}
如果您想改进已经运行的代码,您可能想将其移动到@nada,也许我们需要一个根本不同的算法,而不是改进当前的算法。根本不同的算法在codereview上讨论。规范不清楚,这个例子没有意义,因为它没有dst,也不清楚为什么结果是这样,代码基本上实现了src&mask,只是跳过了第一位,这看起来就像一个bug。请改进这个问题,以明确函数应该做什么。使用-function,您可以将循环迭代次数从sizeofint*8减少到src中的1位№
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;
}