计算数字中特定位的排列

时间:2011-02-22 18:52:48

标签: c++ permutation combinatorics hamming-distance

作为我的硕士论文的一部分,我得到一个带有2位有效位(第2和第4位)的数字(例如5位)。这意味着例如x1x0x,其中$x \in {0,1}$(x可以是0或1),1,0是具有固定值的位。

我的第一个任务是计算上面给定数字2^3 = 8的所有组合。这称为S_1组。

然后我需要计算'S_2'组,这是两个数字x0x0xx1x1x的所有组合(这意味着有效位中的一个不匹配),这应该给我们{{ 1}}。

修改 每个号码$\bin{2}{1} * 2^3 = 2 * 2^3 = 16x1x1x原始号码x0x0x不同,位于一个重要位。

最后一组x1x0x当然是两个与重要位不匹配的,这意味着,所有通过S_3形式的数字,8种可能性。

计算可以递归或独立计算,这不是问题。

如果有人能为这些计算提供一个起点,我会很高兴,因为我所拥有的并不是那么有效。

修改  也许我使用有效位错误地选择了我的单词。我的意思是说五位数的特定位置是固定的。那些我定义为特定位的地方。

修改 我已经看到了2个答案,似乎我应该更清楚了。我更感兴趣的是找到数字x0x1xx0x0xx1x1x,这是一个简单的例子。实际上,组x0x1x(在此示例中为S_1)将使用至少12位长的数字构建,并且可以包含11个有效位。然后我会有12个小组......

如果仍然不清楚,请询问;)

3 个答案:

答案 0 :(得分:1)

#include <vector>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    string format = "x1x0x";

    unsigned int sigBits = 0;
    unsigned int sigMask = 0;
    unsigned int numSigBits = 0;
    for (unsigned int i = 0; i < format.length(); ++i)
    {
        sigBits <<= 1;
        sigMask <<= 1;
        if (format[i] != 'x')
        {
            sigBits |= (format[i] - '0');
            sigMask |= 1;
            ++numSigBits;
        }
    }

    unsigned int numBits = format.length();
    unsigned int maxNum = (1 << numBits);

    vector<vector<unsigned int> > S;
    for (unsigned int i = 0; i <= numSigBits; i++)
        S.push_back(vector<unsigned int>());

    for (unsigned int i = 0; i < maxNum; ++i)
    {
        unsigned int changedBits = (i & sigMask) ^ sigBits;

        unsigned int distance = 0;
        for (unsigned int j = 0; j < numBits; j++)
        {
            if (changedBits & 0x01)
                ++distance;
            changedBits >>= 1;
        }

        S[distance].push_back(i);
    }

    for (unsigned int i = 0; i <= numSigBits; ++i)
    {
        cout << dec << "Set with distance " << i << endl;
        vector<unsigned int>::iterator iter = S[i].begin();
        while (iter != S[i].end())
        {
            cout << hex << showbase << *iter << endl;
            ++iter;
        }

        cout << endl;
    }

    return 0;
}

sigMask的所有特定位都是1。只要您的特定位为1,sigBits就会为1. changedBitsi的当前值与sigBits不同的地方为1。 distance计算已更改的位数。这与您在不预先计算距离计算的查找表时可以获得的效率相同。

答案 1 :(得分:0)

当然,实际上固定位值是什么并不重要,只是它们是固定的。 xyxyx,其中y是固定的而x不是,将始终产生8个电位。 y在它们之间变化的两个组的潜在组合将始终是一个简单的乘法 - 也就是说,对于第一个可能处于的每个状态,第二个可能处于每个状态。

答案 2 :(得分:0)

使用位逻辑。

//x1x1x
if(01010 AND test_byte) == 01010) //--> implies that the position where 1s are are 1.

可能有一个数论解决方案,但是,这很简单。

这需要使用固定位整数类型。一些动态语言(例如python)如果认为这是一个好主意,将扩展位。

这并不难,但这很费时,TDD在这里特别合适。