如何识别二进制数中的奇数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
像这样我想从每个二进制字符串中获取输出
答案 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])*$
要理解这一点,首先让我们假设我们已经知道所有字符都是0
或1
来简化。鉴于(并忽略非捕获技巧),我们可以编写(以扩展形式):
^ .? (1.)* $
A BB CCCCC D <- the key
这是整个字符串(A
和D
)的锚定匹配,它是空字符串,或任何数字(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}
如果这不是您要求的:
答案 5 :(得分:0)
转换为格雷码并检查lsb。