2014-10-03 2 views
0

주어진 비트 수에 따라 16 진수 문자열을 다른 부분으로 분리하는 데 문제가 있습니다.비트 기반의 16 진수 문자열 분리 방법은 무엇입니까?

예를 들어 "400a3b"라는 문자열이 있고 지정된 비트를 기준으로 3 부분으로 나누고 싶다고 가정 해 보겠습니다. 태그, 인덱스 및 순서에 오프셋이 차단되는 세 부분으로 왼쪽에서 오른쪽으로 :

[TAG [INDEX] BLOCK]

이기 지정된 인덱스 량이 3 비트 및라고하자 블록 오프셋은 4 비트입니다. 16 진수 문자열의 특정 부분을 "추출"할 수 있습니까?

+0

"400a3b"문자열에서 Tag = "01000000000011000", Index = "011"및 Block = "1101"을 추출 하시겠습니까? –

+0

예, 그게 현재 시도하고있는 것입니다 – Kevin

답변

0

헥스 문자열에서 therr 부분을 추출 할 계획입니다.

1) 16 진수 문자열을 Long으로 변환합니다.

2) 비트 단위로 "&"(비트 단위) 및 ">>"(비트 단위로 오른쪽 시프트)의 세 부분을 추출합니다.

코드 :

char* hexStr; 
Long original, tag, index,block; 

hexStr = "400a3b"; /* This is hex string to be processed */ 

original = Long.parseLong(hexStr, 16); /* Long converted from hex string */ 

tag = (original & 0xFFFF80) >> 7; /* mask higher 17 bits , then shift right 7 bits for TAG */ 
index = (original & 0x000070) >>4; /* mask 18 to 20 bits , then shift right 4 bit for INDEX */ 
block = original & 0x00000F; /* mask 21-24 bits for BLOCK */ 
마스크를 알고 데이터의 다양한 패턴으로 이동하는 방법

: (. 다음 부분 내 대답에 케빈의 의견에 대한 답변입니다)

알고 마스크와 교대, 데이터의 비트 배열을 만들어 보자. 데이터에 2 비트의 인덱스와 10 비트 블록이있는 경우 나머지 52 비트는 태그입니다.

태그를 사용하여 비트를 표시하려면 't'를 사용하고 색인의 경우 'i'를, 블록의 경우 'b'를 사용합니다. 2 비트 인덱스 10 비트 블록 경우

는 데이터의 비트 구성은 태그의 마스크를 얻었다 'I'는 0과 'B'로, 1 't'를 바꾸려면

ttttttttttttttttttttttttttttttttttttttttttttttttttttiibbbbbbbbbb // 52 't's, 2 'i's and 10 'b's. 

을 다음과 같다 0.

1111111111111111111111111111111111111111111111111111000000000000 

태그 용 마스크이며, 16 진수로 FFFFFFFFFFFFF000을 나타낼 수 있습니다.

오른쪽에 12 개의 0이 있으므로 오른쪽으로 12 비트 이동해야합니다. 마찬가지로

인덱스 마스크 및 그 블록
0000000000000000000000000000000000000000000000000000110000000000 // 0000000000000C00 
0000000000000000000000000000000000000000000000000000001111111111 // 00000000000003FF 

을하고 블록 (10)에 대한 인덱스 인 시프트는 시프트 할 필요가 없다.

충분히 명확합니까?

+0

그래서 이것은 원래 어떻게했는지와 비슷합니다. 그러나 16 진수 문자열은 단지 예일뿐입니다. "f33500cb1"이 될 수도 있고 "35d3"이 될 수도 있으므로 이러한 상황에서 마스크를 구현하는 방법을 모르겠습니다. – Kevin

+0

16 진수 문자열의 최대 문자 수가 16보다 작거나 같으면 "0xFFFF80"을 "0xFFFFFFFFFFFFFF80"으로 대체하면됩니다.16 진수 문자열의 최대 문자 수가 16을 초과하면 Java의 데이터 유형에 64 비트 이상의 정수가 포함될 수 없으므로 코드가 훨씬 복잡해 질 수 있습니다. –

+0

인덱스 및 블록 오프셋에 필요한 비트 수를 모를 경우 어떻게 마스크를 구현합니까? 그것은 인덱스에 대해 2 비트 및 블록 오프셋에 대해 10 비트 또는 인덱스 및 1 블록 오프셋 비트에 대해 10 비트 또는 이들 두 비트에 대한 임의의 주어진 수일 수있다. – Kevin