gpt4 book ai didi

Elixir 位串包含子位串

转载 作者:行者123 更新时间:2023-12-04 10:40:30 25 4
gpt4 key购买 nike

我想检查一个长位串是否包含另一个位串。就像是:

if MyBitstringModule.contains(<<1, 2, 3, 4, 5>>, <<2, 3, 4>>) do
# do stuff
end

如果我有二进制文件,这将非常简单:我可以使用 the =~ operatorString.contains?/2 .但是,这两者都只对二进制文件进行操作,因此在大小不能被 8 整除的位串上会失败。

到目前为止,我想出的最好的是像这样的递归模式匹配(实际上不起作用!),这似乎是一个杂乱无章的事情:
def contains(haystack, needle) when is_bitstring(haystack) and is_bitstring(needle) do
needle_size = bit_size(needle)
case haystack do
<<>> -> false
<<^needle::size(needle_size), _::bitstring>> -> true
<<_::size(1), remainder::bitstring>> -> contains(remainder, needle)
end
end

[请注意,尽管标题或多或少相同,但这实际上并不是 this question 的副本。 - 链接的问题及其答案都只处理二进制文件。]

编辑:我上面的测试用例很糟糕,因为两个参数实际上都是二进制文件。更好的测试用例是:
iex> contains(<<1, 2, 3, 4, 5, 1::size(1)>>, <<2, 3, 4>>)
true
iex> contains(<<1, 2, 3, 4, 5, 1::size(1)>>, <<4, 5, 1::size(1)>>)
true

最佳答案

添加 bitstring 对我有用输入您的真实案例

<<^needle::bitstring-size(needle_size), _::bitstring>> -> true

如果您尝试直接匹配它

iex> needle = <<3, 4, 5>>
<<3, 4, 5>>
iex> needle_size = bit_size(needle)
24
iex> <<^needle::size(needle_size), _::bitstring>> = <<3, 4, 5>>
** (MatchError) no match of right hand side value: <<3, 4, 5>>
iex> <<^needle::bitstring-size(needle_size), _::bitstring>> = <<3, 4, 5>>
<<3, 4, 5>>

关于Elixir 位串包含子位串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com