我正在遍历所有长度的比特串,并想知道如何判断它是否是一个
重复前一个bittring?基本上我想跳过11
,1010
,1111
,0101
,101101
等但不是1011
,1100
,{ {1}},1000
等
这些位串是二进制数字的句点,所以如果它们重复,它会生成相同的数字,这会使我的数据处理程序失效。
重复序列需要相邻并覆盖101001
的所有内容而不会溢出
j
这是我目前的尝试,但它似乎未能检测到任何。
skip = false;
for(int i = 1; i<=n/2 && !skip; i++){
if(n%i == 0){
skip = true;
for(int k=1; k<=n/i; k++) {
if(((j&(j >> (i*k)))&((1<<i) - 1)) != (j&((1<<i) - 1))){
skip = false;
break;
}
}
}
}
if(skip) continue;
是位的长度
n
是位串
编辑:修正了一些输入错误,但现在它检测到j
但未检测到10
答案 0 :(得分:3)
你可以用完全不同的方式做你想做的事。
查看十进制数以减少混淆。例如,数字4545是数字45的重复。要检测到这一点,您可以除以101,并看到结果小于100。
在c ++中:
if (j % 101 == 0 && j / 101 < 100)
现在用基数2替换基数10:
if (j % 5 == 0 && j / 5 < 4)
如果位数不是2而是n
?
1 << n
(1 << n) + 1
如果要检查3个位串的重复怎么办?我不确定你是否想要它,但似乎有可能。
编辑:我懒得开发所有细节,但请考虑以下提示:
pow
;幸运的是,你实际上需要2的幂,所以使用1 << whatever
将2提升到任何力量答案 1 :(得分:1)
重复的模式可能只显示为n
的除数。
因此对于n
来说,它很简单,只需检查两个半位以查看它们是否相同
bool does_bits_repeat(int n, unsigned b)
{
if (n % 2 == 0) {
const unsigned high = b >> (n / 2);
// (high & b) is equivalent to (high & low)
return (high & b) == high;
} else {
// ...
}
}
奇怪的部分更棘手。你必须找到d
的除数n
和来自
k
unsigned k = 1;
for (int i = 0; i != n; i += d) {
k = k << d | 1;
}
// for n == 15, we have
// d == 1, k = binary 111111111111111 (1 repeated 15 times)
// d == 3, k = binary 001001001001001 (001 repeated 5 times)
// d == 5, k = binary 000010000100001 (00001 repeated 3 times)
测试j
是否可被k
整除。