2013-04-08 21 views
14

Tại sao chương trình này hiển thị kết quả sau?Tại sao lệnh std :: bitset <8> không thể xử lý 11111111?

#include <bitset> 
... 

{ 
    std::bitset<8> b1(01100100); std::cout<<b1<<std::endl; 
    std::bitset<8> b2(11111111); std::cout<<b2<<std::endl; //see, this variable 
                  //has been assigned 
                  //the value 11111111 
                  //whereas, during 
                  //execution, it takes 
                  //the value 11000111 
    std::cout << "b1 & b2: " << (b1 & b2) << '\n'; 
    std::cout << "b1 | b2: " << (b1 | b2) << '\n'; 
    std::cout << "b1^b2: " << (b1^b2) << '\n'; 
} 

Đây là OUTPUT:

01000000 
11000111 
b1 & b2: 01000000 
b1 | b2: 11000111 
b1^b2: 10000111 

Trước tiên, tôi nghĩ rằng có cái gì đó sai với tập tin tiêu đề (Tôi đã sử dụng MinGW) vì vậy tôi kiểm tra sử dụng MSVCC. Nhưng nó cũng cho thấy điều tương tự. Hãy giúp tôi.

+2

sử dụng 0xff sẽ sửa chữa nó (hoặc 0b11111111 là trình biên dịch của bạn hỗ trợ nó) –

+0

Nó có thể là kinda gọn gàng nếu nó đã khởi tạo nhị phân trong thập phân như vậy – Inverse

Trả lời

48

Mặc dù có vẻ ngoài, số 11111111 là số thập phân. Biểu diễn nhị phân của 11111111101010011000101011000111 . Khi xây dựng, std::bitset<8> mất tám bit quan trọng nhất trong số đó: 11000111 .

Trường hợp đầu tiên tương tự ngoại trừ 01100100 là bát phân (do số không đứng đầu). Cùng một số được biểu thị bằng nhị phân là 1001000000001000000 .

Một cách để thể hiện một bitet có giá trị là 11111111std::bitset<8> b1(0xff).

Ngoài ra, bạn có thể xây dựng một bitset từ một chuỗi nhị phân:

std::bitset<8> b1(std::string("01100100")); 
std::bitset<8> b2(std::string("11111111")); 
+0

Đáp nhanh và tuyệt vời! Cảm ơn! Hiểu rồi! –

7

Như mỗi câu trả lời NPE, bạn đang xây dựng bitset với một unsigned long, và không phải với bit như bạn đang mong đợi. Một cách khác để xây dựng nó, cho phép bạn chỉ định các bit, là bằng cách sử dụng các nhà xây dựng string như sau:

#include <bitset> 
#include <cstdio> 
#include <iostream> 

int main() 
{ 
    std::bitset<8> b1(std::string("01100100")); std::cout<<b1<<std::endl; 
    std::bitset<8> b2(std::string("11111111")); std::cout<<b2<<std::endl; 
    std::cout << "b1 & b2: " << (b1 & b2) << '\n'; 
    std::cout << "b1 | b2: " << (b1 | b2) << '\n'; 
    std::cout << "b1^b2: " << (b1^b2) << '\n'; 
getchar(); 
return 0; 
} 

Click here để xem kết quả.

+0

Cảm ơn bạn đã giải thích tốt! –

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