2016-11-06 2 views
0

엘릭서의 use Bitwise 인 경우 xor(1, 2) == 3의 두 숫자를 XOR 할 수 있습니다. 파일에서 바이트를 가져와 XOR한다고 할 때, 이 작업을 수행 할 수 있지만 이것이 가장 효율적인 방법이라고 생각하지 않습니다. 캐릭터리스트의 작동 방식에 대해 빠뜨린 건가요?엘릭서의 문자 XOR

defmodule Example do 
    use Bitwise, skip_operators: true 

    def char_xor(a, b) do 
    combined = bxor(
     List.first(String.to_charlist(a)), 
     List.first(String.to_charlist(b)) 
    ) 
    String.Chars.to_string(<<combined>>) 
    end 
end 

어느 다음과 같은 표현이 사실이 될 수 있습니다 :

Example.char_xor("h", "i") == <<1>> 

나는 비약의 일부면 실종이 간단하게 그 (내가 새로 온 사람을!)?

defp char_xor(<<a, as::binary>>, <<b, as::binary>>) do 
    <<bxor(a, b)>> 
end 
+0

문자 또는 바이트를 xor 하시겠습니까? – Dogbert

답변

2

난 당신이 Example.char_xor("h", "i") == <<1>>을 원하는 추측하고있어 당신은 바이트가 아닌 문자를에 xor 할 : 나는 아래 @ dogbert의 좋은 제안을


덕분에 갔어요. 간단한 재귀 함수와 패턴 매칭을 사용하여 반복적으로 첫 번째 바이트를 추출하고, xor 및 반복하여 나머지 바이너리를 처리합니다. 바이너리는 다른 길이의 경우이 오류가 발생됩니다

defmodule Example do 
    use Bitwise, skip_operators: true 

    def char_xor(a, b) do 
    char_xor(a, b, "") 
    end 

    def char_xor("", "", acc), do: acc 
    def char_xor(<<a, as::binary>>, <<b, bs::binary>>, acc) do 
    char_xor(as, bs, <<acc::binary, bxor(a, b)>>) 
    end 
end 
iex(1)> Example.char_xor("h", "i") 
<<1>> 

참고. Example.char_xor/3에 사례를 추가하여 처리하도록 선택할 수 있습니다.

+0

감사합니다. 당신은 실제로 나를 위해 더 복잡한 문제를 해결했습니다 - 저는 단지 두 가지 주장 만 가지고 있습니다. (재귀가 내 목적에는 필요하지 않습니다.) - 내가 한 일을 질문에 추가했습니다. –

관련 문제