2009-11-05 61 views
7

Tôi đang cố đơn giản chuyển đổi một byte nhận được từ fget thành nhị phân.Byte to Binary in C

Tôi biết giá trị của byte đầu tiên là 49 dựa trên việc in giá trị. Bây giờ tôi cần phải chuyển đổi nó thành giá trị nhị phân của nó.

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]); 
} 

này sẽ in:

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

Rõ ràng, đây không phải là một giá trị nhị phân. Bất kỳ giúp đỡ?

Trả lời

16

Vấn đề bạn đang gặp phải là nhiệm vụ của bạn không được kết quả là một giá trị đúng hay sai.

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

Điều này nhận được giá trị của bit. Bạn cần phải xem nếu bit là bật hoặc tắt, như thế này:

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

Một cách, trong số nhiều:

#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; 
} 
5

Thay đổi

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

để

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

hoặc

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

hoặc

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

Bạn có thể nhận thấy rằng đầu ra của bạn có cặp vợ chồng và số 0, nhưng cũng có thể là 2, chẳng hạn như 32. Điều này là do sau khi cô lập bit bạn muốn sử dụng mặt nạ, bạn vẫn phải thay đổi bit vào chữ số ít quan trọng nhất để nó hiển thị dưới dạng 1. Hoặc bạn có thể sử dụng các bài viết khác được đề xuất và thay vì bit chuyển kết quả (ví dụ như 00001000), bạn có thể chỉ cần sử dụng (kết quả! = 0) để tìm nạp 1 hoặc 0, vì trong C, false là 0 và các so sánh như! = sẽ trả về 1 là true (tôi nghĩ).

-1

Ngoài hiển thị thay vì Điều này sẽ làm việc:

bits[i]= byte & (mask << i); 
bits[i] >>=i; 
0
#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(""); 
}