0

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

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

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

编辑 每个数字x1x1x和与原始数字x0x0x不同,在一个有效位上。x1x0x

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

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

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

编辑 也许我错误地选择了我的话,使用了显着位。我的意思是,一个五位数字中的特定位置是固定的。我定义为特定位的那些地方。

编辑 我已经看到了 2 个答案,看来我应该更清楚。我更感兴趣的是找到数字,x0x0x这只是一个简单的例子。实际上,组(在此示例中)将由至少 12 位长的数字构成,并且可能包含 11 个有效位。然后我会有12组...x1x1xx0x1xS_1x1x0x

如果仍有不清楚的地方,请询问;)

4

3 回答 3

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 你所有的特定位。 sigBits在您的特定位为 1 的情况下为 1。changedBits在当前值i不同于的情况下为 1 sigBitsdistance计算已更改的位数。这与您无需预先计算用于距离计算的查找表一样有效。

于 2011-02-22T19:34:40.977 回答
0

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

于 2011-02-22T19:00:42.900 回答
0

使用位逻辑。

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

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

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

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

于 2011-02-22T19:12:26.910 回答