2013-02-13 2 views
1

캐시 시뮬레이터를 작성 중이며 32 비트 주소가 사용됩니다. 비트셋 < 32>를 사용하여 주소를 저장합니다. 디코딩 할 주소의 여러 비트에 액세스하려고하면 문제가 발생합니다. 예 :비트 집합의 다중 비트 액세스

int index = address[index_MSB, index_LSB].to_ulong(); 

주소의 일부 비트에 액세스하려고 시도하고 int로 변환하려고합니다. 오류가 발생합니다. 이렇게 할 방법이 있습니까? 감사!

예 :

주소 = 0x12345678;

index_MSB = 5;

index_LSB = 2;

I [2] [5] 여기 1110 어드레스 및 값을 int로 변환하는 주소로부터 4 개 비트를 필요

: 다수의 비트를 액세스하는 제

+0

는 "시'address'의, 예를 들어 당신의 질문을 명확히하십시오 this'가'이다, 'else'는'that'이고,'index'가'something'이되기를 원합니다 ... type ... 지금 당신이 묻고있는 것이 확실하지 않습니다 ...'index_MSB'와'index_LSB'의 값은 무엇입니까? – Floris

답변

2

일반적인 방법은 할 것이다 숫자와 마스크 사이의 AND 연산. 비트 17 1 경우에만 다음 AND 논리 0이 아닌 결과를 생성하기 때문에, 예를 들어

number = 0xFFAA0055; // an example 
bit17 = 1 << 17;  // counting bit0 as the least significant bit 

bit17set = number & bit17; 

bit17set는 true 될 것이다. 여러 비트에 관심이 있다면

, 당신은 단순히 전에 마스크를 요약 할 수 있습니다 :

bit6 = 1 << 6; 

bit6or17 = bit6 + bit17; 
bit6or17set = number & bit6or17; 

당신이 MSB에서 주소 비트를 원하는 경우에 LSB, 가장 쉬운 작업은 다음과 같습니다

temp = number >> LSB; // this shifts LSB numbers to the right 
answer = temp & ((1<<(MSB-LSB+1) - 1); // a mask of MSB-LSB bits 

int index = ((address >> index_LSB) & (1<<(index_MSB - index_LSB+1)-1)).to_ulong(); 

참고 :

당신은 물론이 두 가지를 결합 할 수있는 모든 위는 "정상적인 가정 "비트가"전통적으로 "저장된 번호. 당신의 address 위의 방법으로 액세스 할 수없는 방식으로 비트를 포함하는 경우에는 대신 다음을 수행 할 수

int ii, index=0; 
for(ii=index_MSB; ii>= index_LSB; ii--) { 
    index = (index << 1) + address[ii]; 
} 
+0

감사합니다. 잘 작동합니다. – ARGOS

+0

두 가지 방법 중 어느 것을 사용 했습니까? 마스크 또는 루프? 대답을 "수락"할 수 있습니까? – Floris

관련 문제