2013-05-10 22 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; 

}