测试数字中的位是否重复

时间:2014-08-11 19:38:34

标签: c++ bit-manipulation

我正在遍历所有长度的比特串,并想知道如何判断它是否是一个 重复前一个bittring?基本上我想跳过11101011110101101101等但不是10111100,{ {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

2 个答案:

答案 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

,该怎么办?
  • 将{4}替换为1 << n
  • 将{5替换为(1 << n) + 1

如果要检查3个位串的重复怎么办?我不确定你是否想要它,但似乎有可能。

编辑:我懒得开发所有细节,但请考虑以下提示:

  • 检测3种模式的重复,每种模式4位:除以100010001
  • 100010001 = 999999999999/9999(十进制表示法)
  • 很容易找出除以什么的通用公式
  • 要计算10的幂,您可以使用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整除。