Python에서 16진수의 비트별 XOR
이 기사의 주요 목표는 Python의 16진수 시스템에서 XOR 숫자로 작업하는 방법을 보여주는 것입니다.
Python에서 16진수의 비트별 XOR
XOR은 배타적 OR을 의미하는 비트 연산자입니다. 두 입력(0 또는 1)이 같으면 1을 반환하는 논리 연산을 수행합니다. 그렇지 않고 입력 숫자가 다르면(예: 0과 1 또는 1과 0) 출력은 0이 됩니다.
XOR은 일반적으로 압축, 암호화, 그래픽 또는 모든 형식의 통신에 사용되는 응용 프로그램에서 사용됩니다. Bitwise 논리 연산자의 일부인 XOR은 더 높은 정밀도를 허용하고 더 적은 리소스를 필요로 하므로 코드를 훨씬 더 빠르고 효율적으로 만듭니다.
^
연산자를 사용하면 십진수에서 숫자를 XOR하는 것이 매우 쉽습니다. 처음에 문자열에 있거나 문자열의 일부인 숫자는 어떻습니까?
다음 코드를 고려하십시오.
def strxor(a, b):
if len(a) > len(b):
return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a[: len(b)], b)])
else:
return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a, b[: len(a)])])
if __name__ == "__main__":
print("1C2 ^ ABC = ", strxor("1C2", "ABC"))
print("2FF ^ 78B = ", strxor("2FF", "78B"))
print("29A ^ 90C = ", strxor("29A", "90C"))
print("10C ^ 24B = ", strxor("10C", "24B"))
print("BAD ^ 432 = ", strxor("BAD", "432"))
print("54F ^ 123 = ", strxor("54F", "123"))
이것은 아래와 같은 출력을 제공합니다:
1C2 ^ ABC = 1121113
2FF ^ 78B = 51264
29A ^ 90C = 1192
10C ^ 24B = 341
BAD ^ 432 = 118114118
54F ^ 123 = 46117
솔루션을 확인해 보겠습니다.
if __name__ == "__main__":
print("1C2 ^ 0xABC = ", 0x1C2 ^ 0xABC)
print("2FF ^ 0x78B = ", 0x2FF ^ 0x78B)
print("29A ^ 0x90C = ", 0x29A ^ 0x90C)
print("10C ^ 0x24B = ", 0x10C ^ 0x24B)
print("BAD ^ 0x432 = ", 0xBAD ^ 0x432)
print("54F ^ 0x123 = ", 0x54F ^ 0x123)
이는 다음과 같은 결과를 제공합니다.
1C2 ^ 0xABC = 2942
2FF ^ 0x78B = 1396
29A ^ 0x90C = 2966
10C ^ 0x24B = 839
BAD ^ 0x432 = 3999
54F ^ 0x123 = 1132
위의 코드에서 볼 수 있듯이 함수에 전달된 두 문자열에 해당하는 a
및 b
라는 두 개의 매개 변수를 사용하는 strxor
라는 새 메서드를 만들었습니다. 이 메서드의 목적은 두 개의 문자열을 가져와서 XOR한 다음 결과(문자열이기도 함)를 반환하는 것입니다.
해결 방법을 확인한 결과 예상과 다른 결과가 나타납니다. 즉, 구현된 함수 strxor
에 논리적 오류가 있습니다.
이 문제에 대한 해결책은 여러 가지 방법으로 접근할 수 있습니다. 이들 중 일부는 다음과 같이 정의됩니다.
솔루션 1
def strxor(a, b):
if len(a) > len(b):
res = "".join(
["%x" % (int(x, 16) ^ int(y, 16)) for (x, y) in zip(a[: len(b)], b)]
)
return int("0x" + res, 0)
else:
res = "".join(
["%x" % (int(x, 16) ^ int(y, 16)) for (x, y) in zip(a, b[: len(a)])]
)
return int("0x" + res, 0)
이는 다음과 같은 결과를 제공합니다.
1C2 ^ ABC = 2942
2FF ^ 78B = 1396
29A ^ 90C = 2966
10C ^ 24B = 839
BAD ^ 432 = 3999
54F ^ 123 = 1132
위에서 언급한 솔루션에서 지정된 문자의 유니코드 코드를 나타내는 숫자를 반환하는 ord()
를 사용하는 대신 코드에서 변경된 내용을 검사할 때 올바른 출력을 표시하도록 원래 함수가 수정되었습니다.
문자열 중 하나인 매개변수와 16진수에 해당하는 숫자의 밑수를 참조하는 16과 함께 int를 사용합니다.
해결책 2
def strxor(a, b):
if len(a) > len(b):
res = "%x" % (int(a[: len(b)], 16) ^ int(b, 16))
return int("0x" + res, 0)
else:
res = "%x" % (int(a, 16) ^ int(b[: len(a)], 16))
return int("0x" + res, 0)
이는 다음과 같은 결과를 제공합니다.
1C2 ^ ABC = 2942
2FF ^ 78B = 1396
29A ^ 90C = 2966
10C ^ 24B = 839
BAD ^ 432 = 3999
54F ^ 123 = 1132
이 방법은 for
루프와 zip
에 의존하지 않습니다. 런타임 및 전체 실행 시간과 관련하여 해당 제품보다 훨씬 빠릅니다.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn