c++位操作如何打印出16、32位

c++ bit operations how to print out 16, 32 bits

本文关键字:32位 打印 位操作 何打印 c++      更新时间:2023-10-16

目前我有一个脚本,它将数值打印成位,例如

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;
}

您可以在print中使用sizeof(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;
}

您可以使用位集,这是最简单的方法。这里有一个例子:

#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*"之前加上"unsigned"。根据标准,对变量内存的访问只有一个变量类型的指针或无符号字符。

最有趣的选择是使用数学,Gynvael Coldwind在这里描述了这一点:http://gynvael.coldwind.pl/n/c_cpp_number_to_binary_string_01011010。

我认为您应该使用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;
}