문제 설명
다음과 같이 이진수를 사용하여 정수를 나타내는 두 가지 패턴이 있습니다.
첫 번째 (표준 십진수를 이진으로 변환) :
0 -> 000
1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111
둘째:
0 -> 0000
1 -> 0001
2 -> 0010
3 -> 0100
4 -> 1000
5 -> 0011
6 -> 0101
7 -> 1001
8 -> 0110
9 -> 1010
10 -> 1100
11 -> 0111
12 -> 1011
13 -> 1101
14 -> 1110
15 -> 1111
설명 : 먼저, 가장 높은 우선 순위를 최하위 비트로 각각 1 비트 씩 뒤집습니다. 그런 다음 두 번째 반복에서 첫 번째 비트를 뒤집은 상태로 유지하고 나머지 비트를 이전과 같이 순서대로 뒤집습니다. 세 번째 반복에서는 최하위 비트가 설정되지 않은 다음 두 번째 중요한 비트가 설정되고 패턴이 계속됩니다.
그러나 이제 첫 번째 패턴과 두 번째 패턴을 하나의 단일 패턴으로 결합하려고한다고 가정 해 보겠습니다. 여기서 일부는 첫 번째 패턴으로 정의되고 나머지는 두 번째 패턴으로 정의됩니다. 예를 들면 :
(첫 번째 패턴, 최대 3 자리 유효 숫자) (두 번째 패턴, 최소 3 자리 유효 숫자)
0 -> 000000
1 -> 000001
2 -> 000010
3 -> 000100
4 -> 000011
5 -> 000101
6 -> 000110
7 -> 000111
8 -> 001000
9 -> 001001
10 -> 001010
11 -> 001100
12 -> 001011
13 -> 001101
14 -> 001110
15 -> 001111
16 -> 010000
17 -> 010001
...
010111
011000
...
목표:
이 두 패턴 중 어떤 비트 그룹이 있는지 알려주는 입력 (비트 수는 우리가 원하는만큼 길 수 있고 패턴 반복은이 세트의 비트 그룹간에 계속 이동할 수 있음); 정수.
입력 패턴을 기반으로 정수를 해당 이진 표현으로 변환하는 출력. E.g. 12 -> 001011
내가 갇힌 곳 :
바이너리 변환은 간단합니다. 두 번째 패턴은 어떻게 만드는지 잘 모르겠습니다. 정수를 두 번째 패턴 이진 표현으로 변환 할 수 있더라도 두 유형을 결합하여 입력 번호에 해당하는 올바른 이진을 찾으려면 어떻게해야합니까? 여기에 패턴이 있기 때문에 이것에 대한 우아한 수학적 표현이 있어야한다고 확신합니다!
내 사용 사례는 무엇입니까?
비슷한 유형의 입력을 기반으로이 이진 표현과 유사한 검색 패턴을 만들려는 응용 프로그램에 대한 코드를 작성하고 있습니다.
숫자에 대한 첫 번째 패턴과 두 번째 패턴을 계산했다고 가정합니다.
다시 "일반"십진수로 변환 한 다음 firstNumber를 3만큼 왼쪽으로 시프트 firstPatterNo << 3
한 다음 두 숫자의 OR을 수행합니다 firstPatterNo | secondPatterNo
.
firstPatterNo = 3 // 011 (normal decimal representations)
secondPatternNo = 4 // 100 (normal decimal representations)
combined = (firstPatterNo << 3) | secondPatternNo
// Convert combined to normal binary representation
BTW 두 번째 패턴의 논리는 무엇입니까? 나는 알아낼 수 없다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다