سؤال

أحاول ببساطة تحويل البايت المستلم من 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;
}

قد تلاحظ أن إخراجك يحتوي على زوجين 1 و 0، ولكن أيضا صلاحيات 2، مثل 32. رقم بحيث يظهر ك 1. أو يمكنك استخدام المشاركات الأخرى المقترحة، وبدلا من تحويل النتيجة (شيء مثل 00001000 00001000)، يمكنك ببساطة استخدام (النتيجة! = 0) لإحضار إما 1 أو 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