문제

나는 단순히 FGET에서 수신 된 바이트를 바이너리로 변환하려고합니다.

나는 첫 바이트의 값이 값을 인쇄하는 것을 기반으로 49라는 것을 알고 있습니다. 이제 이것을 이진 값으로 변환해야합니다.

unsigned char byte = 49;// Read from file
unsigned char mask = 1; // Bit mask
unsigned char bits[8];

  // Extract the bits
for (int i = 0; i < 8; i++) {
    // Mask each bit in the byte and store it
    bits[i] = byte & (mask << i);
}
 // For debug purposes, lets print the received data
for (int i = 0; i < 8; i++) {
printf("Bit: %d\n",bits[i]);
}

이것은 인쇄 할 것입니다 :

Bit: 1
Bit: 0
Bit: 0
Bit: 0
Bit: 16
Bit: 32
Bit: 0
Bit: 0
Press any key to continue . . .

분명히 이것은 이진 값이 아닙니다. 도움이 있습니까?

도움이 되었습니까?

해결책

당신이 가진 문제는 당신의 과제가 참 또는 거짓 가치를 초래하지 않는다는 것입니다.

bits[i] = byte & (mask << i);

이것은 비트의 가치를 얻습니다. 비트가 켜져 있는지 또는 꺼져 있는지 확인해야합니다.

bits[i] = (byte & (mask << i)) != 0;

다른 팁

변화

bits[i] = byte & (mask << i);

에게

bits[i] = (byte >> i) & mask;

또는

bits[i] = (byte >> i) & 1;

또는

bits[i] = byte & 1;
byte >>= 1;

한 가지 방법 중 많은 것 :

#include <stdio.h>
#include <limits.h>

int main(void) {
    int i;
    char bits[CHAR_BIT + 1];
    unsigned char value = 47;

    for (i = CHAR_BIT - 1; i >= 0; i -= 1) {
        bits[i] = '0' + (value & 0x01);
        value >>= 1;
    }

    bits[CHAR_BIT] = 0;

    puts(bits);

    return 0;
}

출력은 32와 같은 2의 힘이지만 2의 힘도 있다는 것을 알 수 있습니다. 마스크를 사용하려는 비트를 분리 한 후에는 여전히 가장 중요하지 않은 것으로 비트로 비트로 비트로 변속해야하기 때문입니다. 숫자는 1으로 표시되도록 또는 다른 게시물이 제안한 것을 사용할 수 있고 결과를 비트 시프팅하는 대신 (예 : 00001000과 같은), 단순히 1 (result! = 0)을 사용할 수 있습니다. 또는 0, c에서는 false가 0이므로! =와 같은 비교는 1으로 반환됩니다.

#include<Stdio.h>
#include <limits.h>
void main(void) {
    unsigned char byte = 49;// Read from file
    unsigned char mask = 1; // Bit mask
    unsigned char bits[8];
    int i, j = CHAR_BIT-1;
          // Extract the bits
    for ( i = 0; i < 8; i++,j--,mask = 1) {
    // Mask each bit in the byte and store it
    bits[i] =( byte & (mask<<=j))  != NULL;
    }
    // For debug purposes, lets print the received data
    for (int i = 0; i < 8; i++) {
       printf("%d", bits[i]);
   }
   puts("");
}

이 대신 에이 추가 기능이 작동합니다.

bits[i]= byte & (mask << i); 
bits[i] >>=i;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top