2010-02-11 34 views
7

Làm cách nào để nhận số bit trong loại char?Nhận số bit trong char

Tôi biết về CHAR_BIT từ climits. Điều này được mô tả là »Macro thu được giá trị lớn nhất cho số bit được sử dụng để biểu diễn một đối tượng kiểu char.« Tại Dikumware's C Reference. Tôi hiểu rằng có nghĩa là số lượng bit trong một char, phải không?

Tôi có thể nhận được kết quả tương tự với std::numeric_limits bằng cách nào đó không? std::numeric_limits<char>::digits lợi nhuận 7 một cách chính xác nhưng không may, bởi vì giá trị này tôn trọng signedness của 8-bit char đây ...

Trả lời

10

Nếu bạn muốn trở thành quá cụ thể, bạn có thể làm điều này:

sizeof(char) * CHAR_BIT 

Nếu bạn biết bạn là chắc chắn sẽ làm sizeof char, đó là một chút overkill như sizeof (char) được đảm bảo là 1.

Nhưng nếu bạn di chuyển đến một loại khác nhau như wchar_t, đó sẽ là quan trọng.

1

Một cách không hiệu quả:

char c; 
int bits; 
for (c = 1, bits = 0; c; c <<= 1, bits++) 
    ; 
printf("bits = %d\n", bits); 
12

CHAR_BIT là, theo định nghĩa, số bit trong các đại diện đối tượng loại [signed/unsigned] char.

numeric_limits<>::digits là số bit không ký hiệu trong biểu thị giá trị của loại đã cho.

Bạn cần loại nào?

Nếu bạn đang tìm kiếm số bit trong các đại diện đối tượng, sau đó cách tiếp cận đúng là để có những sizeof loại và nhân nó bởi CHAR_BIT (tất nhiên, không có điểm nào trong nhân với sizeof trong trường hợp cụ thể của char các loại, vì kích thước của chúng luôn là 1 và từ CHAR_BIT theo định nghĩa alredy chứa những gì bạn cần).

Nếu bạn đang nói về đại diện giá trị thì numeric_limits<> là cách để thực hiện.

Đối unsigned char kiểu bit-kích thước của đại diện đối tượng (CHAR_BIT) được đảm bảo để được giống như bit kích thước của đại diện giá trị, vì vậy bạn có thể sử dụng numeric_limits<unsigned char>::digitsCHAR_BIT thay thế cho nhau, nhưng điều này có thể là vấn đề từ quan điểm về khái niệm của lượt xem.

+0

Vâng, tôi quên đề cập đến lý do tại sao tôi không có nội dung bằng cách sử dụng CHAR_BIT: Tôi muốn nhận được số bit trong một số mã templated, và numeric_limits <> sẽ phù hợp hơn trong lần xem đầu tiên của tôi. Nhưng cách tiếp cận của việc sử dụng sizeof (char) * CHAR_BIT như đã đề cập bởi R Samuel Klatchko thực hiện công việc. – mkluwe

2

Nhìn vào các đoạn lưu trữ cho mã này here, đây là một phiên bản chuyển thể, tôi không yêu cầu mã này:

 
int countbits(char ch){ 
    int n = 0; 
    if (ch){ 
     do n++; 
     while (0 != (ch = ch&(ch-1))); 
    } 
    return n; 
} 

Hope this helps, Trân trọng, Tom.

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