헥스 문자열에서 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)에 대한 인덱스 인 시프트는 시프트 할 필요가 없다.
충분히 명확합니까?
"400a3b"문자열에서 Tag = "01000000000011000", Index = "011"및 Block = "1101"을 추출 하시겠습니까? –
예, 그게 현재 시도하고있는 것입니다 – Kevin