2013-04-08 49 views
14

該程序爲什麼顯示以下輸出?爲什麼std :: bitset <8>變量無法處理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'; 
} 

這是輸出:

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

首先,我想有一些錯誤的頭文件(我是用MinGW的),所以我 使用MSVCC檢查。但它也顯示了同樣的事情。請幫忙。

+2

使用0xff將修復它(或0b11111111是你的編譯器支持它) – 2013-04-08 10:26:05

+0

它可能是有點整潔,如果它做了二進制初始化小數如此 – Inverse 2013-04-11 21:45:43

回答

48

儘管出現,11111111是十進制的。 11111111 的二進制表示是101010011000101011000111 。在構建時,std::bitset<8>取8位最低有效位:11000111

第一種情況類似,但01100100是八進制(由於前導零)。用二進制表示的相同數字是1001000000001000000

表示位值爲11111111 的位集的一種方式是std::bitset<8> b1(0xff)

或者,你可以從一個二進制字符串構造一個bitset:

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

快速和偉大的答案!謝謝!得到它了! – 2013-04-08 10:53:55

7

按NPE的回答,您正在使用unsigned long構建bitset,而不是與位作爲您所期望。的另一種方式來構造它,它使用戶指定的位,是通過使用string構造如下:

#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查看輸出。

+0

感謝您的好解釋! – 2013-04-08 10:54:31

相關問題