2013-05-10 26 views
1

此刻我有腳本,打印出的數值爲比特因此,例如C++位操作如何打印出16,32位

print((short) 1); 

我得到的00000001值,但我怎麼能得到這是一個像00000001 00000000和價值的情況下,如果我打印print((int) 1);我得到的00000001 00000000 00000000 00000000值。 這裏是我的代碼:

void printbyte(unsigned char x) 
{ 
    for (int i = 0; i < 8; i++) 
    { 
     if (x & 0x80) cout << 1; 
     else cout << 0; 
     x = x << 1; 
    } 
    cout << endl; 
} 

template <typename T> 
void print (T A) 
{ 
    unsigned char *p = (unsigned char *) &A; 
    printbyte(*p); 
} 

int main() 
{ 
    print((short) 1); 

    system("pause"); 
    return 0; 
} 
+0

'printbyte'不能打印'00000001 00000000 00000000 00000000'。它只打印8位。 – Nawaz 2013-05-10 10:43:25

+0

用'sizeof(x)'替換'8'。 – 0x499602D2 2013-05-10 10:45:40

回答

3

你可以使用內printsizeof(T),以確定有多少字節處理,然後調用printbyte每個字節,如

#include <iostream> 
#include <climits> 

using namespace std; 

void printbyte(unsigned char x) 
{ 
    for (int i = 0; i < CHAR_BIT; i++) 
    { 
     cout << ((x & 0x80) != 0); 
     x <<= 1; 
    } 
} 

template <typename T> 
void print (T A) 
{  
    for (size_t i = 0; i < sizeof(T); ++i) 
    { 
     unsigned char b = A >> ((sizeof(T) - i - 1) * CHAR_BIT); 
     //unsigned char b = A >> (i * CHAR_BIT); // use this for little endian output 
     printbyte(b); 
     cout << " "; 
    } 
    cout << endl; 
} 

int main() 
{ 
    print((short) 1); 
    print((long long) 42); 

    return 0; 
} 
+0

這看起來很不錯,但用0000000000000000000000000000000而不是'000000000000000000000000000000001',是否可以正確更改?不管怎麼說,還是要謝謝你!! – Sangsom 2013-05-10 11:00:06

+0

那麼這將是很容易扭轉循環的順序,但我認爲這將是一個小endian格式的打印值,相當混亂。如果這就是你想要的,只需改變'unsigned char b = A >>((sizeof(T) - i - 1)* CHAR_BIT);'to'unsigned char b = A >>(i * CHAR_BIT);'。 – 2013-05-10 11:02:42

+0

哇,這是驚人的隊友,非常感謝! – Sangsom 2013-05-10 11:04:20

0

您可以使用bitset,這是最簡單的方法。這裏有一個例子:

#include <iostream> 
#include <bitset> 

using namespace std; 

int main() 
{ 
int number; 
cin>>number; 
bitset <16> end (number); 
cout<<number<<" --> "<<end<<'\n'; 
return 0; 
} 

或參考:http://www.cplusplus.com/reference/bitset/bitset/

如果你不想使用標準的解決方案,它也可以是這樣的:

#include <iostream> 
#include <climits> 
using namespace std; 

template <typename Type> 
void bprint(Type in) 
{ 
    unsigned char* p = (reinterpret_cast<unsigned char*>(&in))+(sizeof(Type)-1); //x86 
    for(unsigned int n = sizeof(Type);n--;--p, std::cout<<' ') 
    for(unsigned int i = CHAR_BIT;i--;) 
    std::cout<<((*p&char(1<<i))!=0); 
    std::cout<<'\n'; 
} 

int main(void) 
{ 
int number; 
cin>>number; 
bprint(number); 
bprint(short(number)); 
bprint(char(number)); 
return 0; 
} 

「簽名」 之前 「的char *」是必需的,如果它沒有被默認設置。根據標準,訪問變量的內存只有一個變量類型或無符號字符的指針。

最有趣的選擇是數學的使用,尤其是由Gynvael Coldwind在這裏描述:http://gynvael.coldwind.pl/n/c_cpp_number_to_binary_string_01011010

0

我認爲你應該使用std::bitset,但你總是必須在編譯時指定大小。 爲了避免這種情況,你可以使用這樣的模板函數(注意,這是C++ 11):

#include <iostream> 
#include <bitset> 
#include <limits> 

template <class T> void PrintBits (const T &Number) { 
    std::bitset<std::numeric_limits<T>::digits> Bit_Number(Number); 
    std::cout << Bit_Number << std::endl; 

}