2015-07-09 13 views
8

Tôi chỉ cần một chút để trình bày dữ liệu của mình - 1 hoặc 0. Cách tốt nhất để làm điều đó trong C là gì? Các loại dữ liệu "bình thường" quá lớn.Loại dữ liệu nhỏ nhất - tôi có thể xác định biến số một bit không?

+1

Bộ nhớ có quá khan hiếm đến nỗi bạn cần lưu trữ các giá trị dưới dạng bit riêng lẻ không? Những gì bạn đang sử dụng nó cho? Có thể có một cách tốt hơn. –

Trả lời

5

Nếu bạn thực sự muốn, bạn có thể tạo cấu trúc có biến thành viên, bit-fielded đến 1 bit.

Hãy nhớ rằng, loại dữ liệu của biến thành viên cần phải là unsigned, vì bạn cần lưu trữ 01.

10

Bạn có thể tạo

typedef struct foo 
{ 
    unsigned x:1; 
} foo; 

Trong trường hợp bạn đã nói với trình biên dịch mà bạn sẽ chỉ sử dụng một chút x.

Nhưng do sắp xếp đóng gói cấu trúc (tiêu chuẩn C cố ý linh hoạt để các trình biên dịch có thể tối ưu hóa theo kiến ​​trúc máy), nó cũng có thể chỉ ra khoảng trống trong bộ nhớ là unsigned và mảng của foo s không phải là bitwise tiếp giáp.

0

Thông thường, đoạn dữ liệu nhỏ nhất có thể định địa chỉ trong C là byte. Bạn không thể có một con trỏ đến một chút, do đó bạn không thể khai báo một biến có kích thước 1 bit. Nhưng như Sourav Ghosh đã chỉ ra, bạn có thể khai báo bitfields, nơi mà một bit được truy cập trực tiếp.

1

Cách di động là định nghĩa của biến mà từng bit riêng lẻ được sử dụng làm cờ.

#define FLAG_FOO 0 
    #define FLAG_BAR 1 

    // in case platform does not support uint8_t 
    typedef unsigned char uint8_t; 

    uint8_t flags; 

    void flag_foo_set() 
    { 
     flags |= (1 << FLAG_FOO); 
    } 

    void flag_foo_clr() 
    { 
     flags &= ~(1 << FLAG_FOO); 
    } 

    uint8_t flag_foo_get() 
    { 
     return flags & (1 << FLAG_FOO); 
    } 

Trong khi điều này có thể có vẻ superfluos so với các trường bit C. Nó có thể di chuyển về cơ bản mọi trình biên dịch ANSI C.

+1

Rất đơn giản, không 'uint8_t' ** có ** được hỗ trợ bởi * mọi trình biên dịch ANSI C không? Tôi không hoàn toàn chắc chắn. 'unsigned char' có thể là một lựa chọn tốt hơn. – Bathsheba

+2

Không, các kiểu uintX_t chỉ được C99 yêu cầu - cho tính di động đầy đủ, hãy sử dụng 'unsigned char' –

+1

' typedef unsigned char uint8_t; 'có vẻ như có thể gây nguy hiểm cho tôi. – Bathsheba

3

Nếu bạn không cần hàng triệu của những cờ này hoặc có giới hạn bộ nhớ rất hạn chế, cách tốt nhất là dứt khoát là int.

Điều này là do int thường tương ứng với kích thước từ tự nhiên của nền tảng của bạn và có thể được căn chỉnh chính xác, được truy cập nhanh chóng. Máy đọc một từ tại một thời điểm anyways và sử dụng các bit duy nhất yêu cầu masking và chuyển dịch, mà chi phí thời gian. Trên PC thông thường của bạn với gigabyte RAM, điều này sẽ chỉ là ngớ ngẩn.

Nếu mức tiêu thụ bộ nhớ thực sự là một vấn đề, có cấu trúc bitfield.

Các vấn đề liên quan