如何使用位集< >计算位转换
How to calculate bit transitions using bitset < >
我是c++新手。我想计算在9位序列中从0到0,0到1,1到0和1到1的转换次数。我写了下面的代码:
int main {
srand((unsigned)time(0));
unsigned int x;
for (int i=0:i<=512;i++) // loop-1
{
x=rand()%512;
bitset<9>bitseq(x);
for(int j=0;j<=bitseq.size();j++) // loop-2
{
bool a= bitseq.test(j);
bool b= bitseq.test(j+1)
if ((a==0)&(b==0)==0)
{
transition0_0 = transition0_0 + 1; // transition from 0 to 0
}
else if ((a==0)&(b==1)==0)
{
transition0_1 = transition0_1 + 1;
else if ((a==1)&(b==0)==0)
{
transition1_0 = transition1_0 + 1;
else
{
transition1_1 = transition1_1 + 1;
cout<<transition0_0<<" "<<transition0_1<<endl;
cout<<transition1_0<<" "<<transition1_1<<endl;
}
}
谁来指点我一下
- 如何保存最后一个位值在环-2检查从最后一个bitset输出的最后一个比特到下一个bitset输出的第一个比特的过渡?
- 如果这不起作用,我怎么能把它保存在矢量和使用迭代器来检查过渡?
首先,循环索引j运行在bitset
的末尾。指数从0到bitseq.size()-1
(包括)。如果你要测试j
和j+1
, j
可以取的最大值是bitseq.size()-2
。
==0
部分出现在你的if
s是奇怪的,你应该使用
if( (a==0)&&(b==0) )
注意两个&&
的使用。虽然单个&
适用于此代码,但我认为最好使用正确传达您意图的操作符。
然后回答你的问题,你可以保留一个"最后一位"变量,它最初被设置为一个哨兵值(表明你现在看到的是第一个bitseq),并在循环2开始之前将它与bitseq[0]进行比较。这是你的代码的修改版本,它应该可以完成你的要求。
int main {
srand((unsigned)time(0));
unsigned int x;
int transition0_0 = 0,
transition0_1 = 0,
transition1_0 = 0,
transition1_1 = 0;
int prev = -1;
for (int i=0:i<=512;i++) // loop-1
{
x=rand()%512;
bitset<9> bitseq(x);
if( prev != -1 ) // don't check this on the first iteration
{
bool cur = bitseq.test(0);
if( !prev && !cur )
++transition0_0;
else if( !prev && cur )
++transition0_1;
else if( prev && !cur )
++transition1_0;
else
++transition1_1;
}
for(int j=0;j+1<bitseq.size();j++) // loop-2
{
bool a= bitseq.test(j);
bool b= bitseq.test(j+1)
if ((a==0)&&(b==0))
{
transition0_0 = transition0_0 + 1; // transition from 0 to 0
}
else if ((a==0)&&(b==1))
{
transition0_1 = transition0_1 + 1;
}
else if ((a==1)&&(b==0))
{
transition1_0 = transition1_0 + 1;
}
else
{
++transition1_1 = transition1_1 + 1;
}
} // for-2
prev = bitseq.test(bitseq.size()-1); // update prev for the next iteration
cout<<transition0_0<<" "<<transition0_1<<endl;
cout<<transition1_0<<" "<<transition1_1<<endl;
} // for-1
} // main
这样的东西对你会更好吗?使用4个整数数组[0]= 0 -> 0,[1]= 0 -> 1,[2]= 1 -> 0,[3]= 1 -> 1。
int main {
int nTransition[] = { 0,0,0,0 };
bool a,b;
unsigned int x;
int j;
srand ((unsigned)time(0));
for (int i = 0: i < 512; i++) {
x = rand () % 512;
bitset<9> bitseq(x);
if (i == 0) {
a = bitseq.test (0);
j = 1;
} else
j = 0;
for (; j < bitseq.size (); j++) {
b = bitseq.test(j);
int nPos = (a) ? ((b) ? 3 : 2) : ((b) ? 1 : 0);
nTransition[nPos]++;
a = b;
}
}
}
相关文章:
- C++在数学计算中将double转换为int
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 如何使用 ASCII 转换使用字符堆栈计算后缀表达式
- 如何将此代码转换为两个以上的数字(计算HCF)
- 通过计算或铸造在C++中来回转换 2 的值补码?
- 使用 GLSL 直接从着色器中的位置计算转换矩阵
- 如何转换一个普通的makefile以创建可以在另一台计算机上使用的静态可执行文件
- 如何计算将数组中的所有n个数转换为m的最小成本
- 创建一个函数,该函数根据边缘转换为给定(浮点)时间值计算布尔返回值
- 将中缀转换为后固定N位数的计算
- C++转换:具有指向对象成员的指针,计算指向对象的指针
- 计算字符串/数组元素的十六进制,然后将其转换为十进制
- 程序计算、类型转换错误
- 将 UTF-8 转换为 UTF-32,预先计算每个'chars'数
- 如何将特定数量的字符转换为大写或小写,并计算单词有多少个大写和小写字母
- 将军事时间转换为标准格式(HH:MM)并以标准格式计算平均值.三个问题
- 如何使用 WinAPI 可靠地将本地时间转换为 UTC C++ 在 Windows 计算机上
- 为什么浮动计算和强制转换在调试和发布配置中显示不同的结果
- 将字符串/字符转换为double,然后使用double进行计算
- 将十进制转换为二进制,并计算其中的数字非常非常大