2016-07-11 2 views
0

나는 μC로 0과 1의 묶음을받는 프로그램을 만들고 있으며, 어느 위치에서나 비트 (1에서 16까지)를 가져갈 필요가있다.마이크로 컨트롤러로 0s와 1s 묶음을 처리하는 방법은 무엇입니까?

I.E. 나는 150 비트가 있고 32 비트에서 6 비트를 가져 와서 char (8 비트) 변수에 복사하려고합니다. ASCII 0과 1로 저장하여 문자열로 처리 할 수 ​​있다는 것을 알고 있지만 RAM이 많지 않으므로 비트로 저장해야합니다.

더 큰 변수는 부호없는 32 비트 길이이지만 데이터를 저장하는 것은 제 문제가 아닙니다. 문제는 특정 비트 위치에 액세스하여 char (8) 변수에 복사하는 방법입니다.

+0

어쩌면 사용하는 비트 마스크 ("논리적 또는") 다시 문자

예를 얻으려면? –

+0

나는 전에 비트 마스크를 사용한 적이 없다. 28 번에서 36 번까지 비트를 추출해야한다면 더 큰 변수는 32 비트이므로이 방법이 효과가 있습니까? –

+0

36? 32 비트 변수에서 비트 36은 어디에 있습니까? –

답변

1

당신은 비트 연산자를 사용할 수 있습니다

코드 가정 위
//bits: your bits (byte array), start: index of the first bit of the char you want 
char select(char* bits, int start) { 
    dec = start%8; 
    return bits[start/8]>>dec + bits[start/8+1]<<dec; 
} 

이 < (bits.size() - 8)를 시작

[ 편집] 당신은 어떤에 숯불 *을 변경할 수 있습니다 원하는 유형. 그러나 dec 값을 적절한 비트 수 (8 * SIZE_IN_BYTES)로 변경 한 다음 연산자 |

char select(int* bits, int start) { 
    nbitsint = 8*4; 
    dec = start%nbitsint; 
    if (dec < nbitsint-8) { 
     // | 0xff creates creates a byte 
     return (bits[start/nbitsint]>>((3-dec/8)*8+dec%8) | 0xff; 
    } 
    // Getting a byte which is astride two values is tricky 
    return (bits[start/nbitsint]>>(start%8) + bits[start/nbitsint+1]<<(start%8) | 0xff; 
} 
+0

컴파일러가 허용하는 더 큰 변수는 32 비트입니다. 더 긴 비트 배열을 만들 수 있습니까? 나는 전에 그것을 한 적이 없다. –

+0

변수의 ** 최소 크기 **는 ** 바이트 ** (8 비트)이므로 * char * (1 바이트)를 사용했습니다. 더 큰 변수 (예 : * int32 *)를 사용하려면 필요한 바이트 수로 이동해야합니다. –

+0

예,하지만 5 개의 32 비트 변수로 분할 된 150 비트는 단일 변수가 아닙니다. 그래서 28 비트에서 6 비트를 원한다면 첫 번째 변수에서 4 비트, 두 번째 변수에서 2 비트가 필요합니다. –