2012-06-10 2 views
7

비트 연산자에 대한 기본적인 지식이 있습니다. 나는 가치가 할당 된 방법을 이해하기가 어려울 것이다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 매우 감사 할 것입니다.16 진수 값을 비트 단위로 조작하는 방법은 무엇입니까?

내 진수 주소 : 0xE0074000

진수 값 : 3,758,571,520

이진 값 : 나는 간단한 마이크로 컨트롤러를 프로그래밍 및 Microsoft에 등록 액세스 클래스를 사용하는 것을 시도하고있다 11100000000001110100000000000000

. Net Micro Framework를 통해 컨트롤러가 원하는대로 할 수 있습니다.

Register T2IR = new Register(0xE0074000); 
T2IR.Write(1 << 22); 

위 예제에서 이진 표현의 비트는 어떻게 이동합니까? 바이너리 형식의 주소에 비트 관리가 어떻게 할당되는지 이해할 수 없습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 매우 위대 할 것입니다.

답변

9

처음에는 소수를 잊어 버려야합니다. 나중에 다시 돌아올거야.

먼저 16 진수와 2 진수 사이의 논리를 확인해야합니다.

좋아 바이트 대해 8 비트 (# 7-0)가 읽을

#7 = 0x80 = %1000 0000 
#6 = 0x40 = %0100 0000 
#5 = 0x20 = %0010 0000 
#4 = 0x10 = %0001 0000 

#3 = 0x08 = %0000 1000 
#2 = 0x04 = %0000 0100 
#1 = 0x02 = %0000 0010 
#0 = 0x01 = %0000 0001 

바이너리, 바이트에서,이 1% 00001000

같은 비트 세트 바로 일명 비트 08 진수의 값이있는 # 3에서 4 우리가 바이너리 번호 %이있는 경우 지금

을 (여전히 또한 소수 사실,하지만 당신은 진수/바이너리를 파악하면서 소수 잊어)입니다 10000000 이것은 켜져있는 # 7 비트입니다. 즉

최대 당신이 얻을 수 (육각 바이트의 각 부분이 약간 괴짜하여 니블라고 함) "니블"에서 그 (것)들을 정리해 0x80으로

그래서 당신이해야 할 모든이의 16 진수 값을 가지고 니블에 (10 진수) 15 F는 등을 0x10 + 0x20에 + 0 × 40 + 0x80으로 =의 0xF0 = 이진 % 11110000

그래서 니블 (4 비트)의 모든 조명 = F는 헥스 (15 진수)

같은 낮은 니블갑니다.

패턴이 보입니까?

+0

에 의해 정수 나누어 모든처럼 그래, 내가 볼 방법이 부분 작업, 우수한 설명 주셔서 감사합니다! 따라서 우리가 000011001000의 값을 가지고 이것을 수행하면 (8 << 1) 그러면 000111001000이 남게됩니다. 맞습니까? –

+0

그래서 32 비트 길이의 0과 1의 2 진수 배열을 가지고 있고 8을 1 씩 이동하려고했다면 하나의 값만 수정할 수 있습니까? 예 : bin [7] = 1; ?? –

+0

우리가 이것을 원한다면 (8 << 3)이 것이 옳은가? bin [7] = 1; bin [8] = 1; bin [9] = 1; ? –

3

변화가 무엇인지에 대한 @ BerggreenDK의 대답을 참조하십시오. 다음은 16 진수로 된 것과 같은 정보입니다 (동일한 것, 다른 표현).

이동을 이해하는 것은 매우 간단한 개념입니다. 레지스터는 고정 된 크기이며, 적합하지 않은 비트가 끝나면 떨어집니다. 그래서,이 예제를 가지고 : 진수의

int num = 0xffff << 16;

귀하의 변수는 이제 0xffff0000이 될 것입니다. 오른쪽 끝이 0으로 채워지는 점에 유의하십시오. 자, 다시 시프트하자.

num = num << 8; 
num = num >> 8; 

num 지금 0x00ff0000입니다. 너는 옛날의 돈을 돌려받지 못한다. 오른쪽 교대에도 똑같이 적용됩니다.

트릭 : 1로 왼쪽 이동은 2 수를 곱 같고, 1로 바로 이동 2.

+0

문제가 비트 연산자에 없습니다. 문제는 클래스에 있으며 클래스가 등록 주소에 정보를 할당하는 방법입니다. 그래서이 경우에 : Register.SetBits ((3 << 8)); // 레지스터의 비트 조작 ... 비트는 어떻게 할당됩니까? Register는 어디서 어떤 비트를 조작해야하는지 어떻게 알 수 있습니까? 데이터 시트에서 비트 3을 1로 설정해야한다면 비트 연산을 어떻게 올바르게 수행 할 수 있습니까? –

+0

URL 링크 : [Register Class Documentation] (http://www.ghielectronics.com/downloads/NETMF/Library%20Documentation/html/73f12956-6a7d-d693-6db8-4ec605c50f2d.htm) 설명서 링크. 간결하고 나에게 답을주지 않습니다. –

+0

Ok, 유레카 모멘트, 마스크의 값 1 비트가 레지스터에 설정됩니다. 마스크에서 값 0의 비트는 변경되지 않습니다. 따라서 값을 레지스터에 할당하기 전에 바이너리 값을 설정해야합니다. 따라서 0010011 (0) 11을 괄호 안에 넣고 싶다면이 BIT를 설정하기 위해 0100의 바이너리를 파싱해야합니다! 드디어 우우! –

관련 문제