2017-05-03 21 views
-1

현재 16 비트 레지스터에서 9 비트 (마지막 9 개)를 추출 중입니다. 비트를 추출하는 데 문제가 없습니다. 그러나 비트를 추출 할 때 마지막에 7 '0을 가질 추출 값이 있습니까? 표현 :레지스터에서 특정 비트를 추출 할 때 추출 된 값이 레지스터와 동일한 크기를 가져야합니까?

등록 : 1100101011110011

비트 마스크 : 1111111110000000

내 추출 된 가치인가 : 110,010,101 (405)

또는이다 : 사전에 1100101010000000 (51840)

감사합니다 .

+1

'1100101010000000' 사용'와 (&)'추출 – Sniper

+2

두 번째에,하지만 당신은 쉽게 등록 및 mask''의 결과를 인쇄 할 수있는 경우 ..... – LPs

+1

이 코드를 표시합니다. 이 질문을하는 경우 비트를 추출하는 데 문제가 있습니다. –

답변

0

두 가지 모두 쉽게 달성됩니다. 같은 BMI2 확장을 지원하는 x86와 같은

(unsigned short)reg >> (16-9) == 405, // where as 
reg & bitmask == 51840 

일부 "컨트롤러"그러나 제목에 문제가없는 것입니다 (405)

구체적인 답을주지 않았 비트 마스크 PEXT reg, bitmask로 추출 비트; 출력 변수에는 충분한 비트가 있어야합니다.

unsigned char eight_bits = reg >> 8; // get's top 8 bits 
+2

'unsigned short' 로의 캐스트는 부적절하고 미혹입니다. 무엇이든간에, 부호 비트의 구현이 정의 된 것을 피하려면 '부호없는 정수'로 형변환해야합니다. – Olaf

+0

@Olaf : 정확하지 않습니다. unsigned int로 변환하면 부호 비트가 복사되어 1111111110010101을 생성합니다 (레지스터가 short로 정의 된 경우) –

+0

'부호없는 정수'에 부호 비트가 없습니다! 어떤 타입이 당신의'reg'을 가지고 있습니까? 하드웨어 주변기기 레지스터는 항상 부호없는 정수 여야하므로 캐스트가 어떤 eiher도 생성하지 않습니다. 부호있는 (signed)에서 'unsigned (unsigned)'int'로의 변환을 명확하게 정의하자. – Olaf