作为我的硕士论文的一部分,我得到一个带有2位有效位(第2和第4位)的数字(例如5位)。这意味着例如x1x0x
,其中$x \in {0,1}$
(x可以是0或1),1,0
是具有固定值的位。
我的第一个任务是计算上面给定数字2^3 = 8
的所有组合。这称为S_1
组。
然后我需要计算'S_2'组,这是两个数字x0x0x
和x1x1x
的所有组合(这意味着有效位中的一个不匹配),这应该给我们{{ 1}}。
修改
每个号码$\bin{2}{1} * 2^3 = 2 * 2^3 = 16
和x1x1x
与原始号码x0x0x
不同,位于一个重要位。
最后一组x1x0x
当然是两个与重要位不匹配的,这意味着,所有通过S_3
形式的数字,8种可能性。
计算可以递归或独立计算,这不是问题。
如果有人能为这些计算提供一个起点,我会很高兴,因为我所拥有的并不是那么有效。
修改 也许我使用有效位错误地选择了我的单词。我的意思是说五位数的特定位置是固定的。那些我定义为特定位的地方。
修改
我已经看到了2个答案,似乎我应该更清楚了。我更感兴趣的是找到数字x0x1x
,x0x0x
和x1x1x
,这是一个简单的例子。实际上,组x0x1x
(在此示例中为S_1
)将使用至少12位长的数字构建,并且可以包含11个有效位。然后我会有12个小组......
如果仍然不清楚,请询问;)
答案 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. changedBits
在i
的当前值与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在这里特别合适。