如何识别二进制数中的奇数1

时间:2010-08-05 11:46:00

标签: regex tcl

如何识别二进制数中的奇数1,我的二进制数是,即每个奇数位是1的二进制数

1 1 0 0 1 0 0 0 1 0   1  0 1  0  1   1  1 1  1  1  0  1  1  0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
11010101010101111110110
11101101010101100011011
11111100110101010111101

我想得到输出什么位是奇数1,我得到一个使用基本正则表达式 每个字符串的输出都是这样的

1 1 1  1  1 1  1  1  1
1 5 9 11 13 15 17 19 23

像这样我想从每个二进制字符串中获取输出

6 个答案:

答案 0 :(得分:7)

我将问题解释为“查找给定的二进制数是否包含1的奇数”**。此正则表达式将匹配所有二进制数与偶数数字1:

^0*(?:10*10*)*$

取消匹配结果以获得预期结果。

**我知道,可能不太可能,但嘿......

编辑:对OP的输入进行验证,如下所示:

110010001010101111110110 - MATCH (even number of 1's)
11010101010101111110110  - NO MATCH (odd number of 1's)
11101101010101100011011  - MATCH (even number of 1's)
11111100110101010111101  - MATCH (even number of 1's)

答案 1 :(得分:4)

假设每个字符串表示一个大端形式的二进制数(位从零开始编号,指的是字符串的最后一个字符),确定是否所有奇数位(即位#1,位#3)字符串中的位#5等)通过测试字符串是否与此正则表达式匹配来完成:

^[01]?(?:1[01])*$

要理解这一点,首先让我们假设我们已经知道所有字符都是01来简化。鉴于(并忽略非捕获技巧),我们可以编写(以扩展形式):

^ .? (1.)* $
A BB CCCCC D <- the key

这是整个字符串(AD)的锚定匹配,它是空字符串,或任何数字(B)或任意数量的1后跟任何(C,将1置于“奇数”位置)或偶数位数之前的数字1位于“奇数”位置({{1然后是B)。我刚刚通过限制符号的字母表(C[01])并使用非捕获括号(.代替)将该基本表单转换为更高效和准确的表示形式(?:…))。

如果你考虑第一位是#1,你需要这个RE:

(…)

对于little-endian位字符串,您需要“反转RE”(或使用要匹配的字符串上的string reverse并使用其他匹配器之一)。小端位#0-第一形式的“反向RE”是:

^1?(?:[01]1)*$

对于little-endian位#1-first:

^(?:[01]1)*[01]?$

请记住,使用所有这些正则表达式,最简单的方法是将它们放在Tcl中,方法是将它们括在^(?:1[01])*1?$ 卷曲{括号中。


示范:

}

生成此输出:

110010001010101111110110 doesn't match
11010101010101111110110 doesn't match
11101101010101100011011 doesn't match
11111100110101010111101 doesn't match
1110111011111010111010 matches

答案 2 :(得分:3)

让我们首先考虑一个更简单的问题:使用正则表达式匹配包含奇数1一元字符串(仅包含1)。所以我们希望匹配1(1),111(3),11111(5),...,但不匹配空字符串(0),11(2 ),1111(4),...

要执行此操作,请匹配1对,只留下一个1未配对。因此,模式是(also on rubular):

^(11)*1$

现在我们可以修改这个基本模式以适应0。我们观察到:

  • 0*可以出现在第一个1
  • 之前
  • 0*可以在最后1
  • 之后显示
  • 0*可以出现在

也就是说,我们需要在这4点插入0*

  \/  \/
^(11)*1$
/\ /\

因此模式是(see matches on rubular.com):

^0*(10*10*)*10*$

我们可以做一些优化,例如使捕获组不捕获,甚至原子化,并使*占有,但这种模式是有效的,不会灾难性地回溯。

参考

答案 3 :(得分:2)

您需要查看的是最后一位数。

如果为1,则相应的十进制数是奇数。

如果为0,则为偶数。

答案 4 :(得分:2)

如果你想知道如何检测一个奇数二进制数,你只需看看最后一位数是1还是奇数。

使用正则表达式,表达式为:

1$

或者如果你必须匹配整个字符串,那么:

^[10]+1$


你不需要正则表达式 ...伪代码:

if right(string,1) == 1

这种方法比正则表达式更好,因为正则表达式不会向后工作,所以它必须在它到达结尾之前遍历整个字符串。

right / end函数可以直接查看最后一个字符,这当然更简单,更快。

好的,tcl的语法是:

if {[string index $str end] eq 1}


如果这不是您要求的

  1. 将更多详细信息放入问题中,确切了解您的需求。
  2. Mark接受了之前一些问题的答案。

答案 5 :(得分:0)

转换为格雷码并检查lsb。