C++ 如何以二进制形式打印(使用 cout)一个数字?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7349689/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 16:48:51  来源:igfitidea点击:

How to print (using cout) a number in binary form?

c++binaryiostreamrepresentationstd-bitset

提问by Jesse Emond

I'm following a college course about operating systems and we're learning how to convert from binary to hexadecimal, decimal to hexadecimal, etc. and today we just learned how signed/unsigned numbers are stored in memory using the two's complement (~number + 1).

我正在学习关于操作系统的大学课程,我们正在学习如何从二进制转换为十六进制、十进制到十六进制等。今天我们刚刚学习了如何使用二进制补码 (~number) 将有符号/无符号数字存储在内存中+ 1)。

We have a couple of exercises to do on paper and I would like to be able to verify my answers before submitting my work to the teacher. I wrote a C++ program for the first few exercises but now I'm stuck as to how I could verify my answer with the following problem:

我们在纸上有几个练习要做,我希望能够在将我的作业提交给老师之前验证我的答案。我为前几个练习编写了一个 C++ 程序,但现在我不知道如何用以下问题验证我的答案:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

and we need to show the binary representation in memoryof a, band c.

我们需要在内存中显示a,b和的二进制表示c

I've done it on paper and it gives me the following results (all the binary representations in memory of the numbers after the two's complement):

我已经在纸上完成了它,它给了我以下结果(二进制补码后数字内存中的所有二进制表示):

a = 00111010 (it's a char, so 1 byte)

b = 00001000 (it's a char, so 1 byte)

c = 11111110 11000101 (it's a short, so 2 bytes)

a = 00111010(它是一个字符,所以 1 个字节)

b = 00001000(它是一个字符,所以 1 个字节)

c = 11111110 11000101(它很短,所以 2 个字节)

Is there a way to verify my answer? Is there a standard way in C++ to show the binary representation in memory of a number, or do I have to code each step myself (calculate the two's complement and then convert to binary)? I know the latter wouldn't take so long but I'm curious as to if there is a standard way to do so.

有没有办法验证我的答案?C++ 中是否有标准方法来显示数字内存中的二进制表示,还是我必须自己编写每个步骤(计算二进制补码然后转换为二进制)?我知道后者不会花这么长时间,但我很好奇是否有标准的方法来做到这一点。

回答by Jerry Coffin

The easiest way is probably to create an std::bitsetrepresenting the value, then stream that to cout.

最简单的方法可能是创建一个std::bitset表示值,然后将其流式传输到cout.

#include <bitset>
...

char a = -58;    
std::bitset<8> x(a);
std::cout << x << '\n';

short c = -315;
std::bitset<16> y(c);
std::cout << y << '\n';

回答by r233967

Use on-the-fly conversion to std::bitset. No temporary variables, no loops, no functions, no macros.

使用即时转换为std::bitset. 没有临时变量,没有循环,没有函数,没有宏。

Live On Coliru

Live On Coliru

#include <iostream>
#include <bitset>

int main() {
    int a = -58, b = a>>3, c = -315;

    std::cout << "a = " << std::bitset<8>(a)  << std::endl;
    std::cout << "b = " << std::bitset<8>(b)  << std::endl;
    std::cout << "c = " << std::bitset<16>(c) << std::endl;
}

Prints:

印刷:

a = 11000110
b = 11111000
c = 1111111011000101

回答by Cubbi

If you want to display the bit representation of any object, not just an integer, remember to reinterpret as a char array first, then you can print the contents of that array, as hex, or even as binary (via bitset):

如果要显示任何对象的位表示,而不仅仅是整数,请记住首先将其重新解释为 char 数组,然后您可以将该数组的内容打印为十六进制,甚至二进制(通过 bitset):

#include <iostream>
#include <bitset>
#include <climits>

template<typename T>
void show_binrep(const T& a)
{
    const char* beg = reinterpret_cast<const char*>(&a);
    const char* end = beg + sizeof(a);
    while(beg != end)
        std::cout << std::bitset<CHAR_BIT>(*beg++) << ' ';
    std::cout << '\n';
}
int main()
{
    char a, b;
    short c;
    a = -58;
    c = -315;
    b = a >> 3;
    show_binrep(a);
    show_binrep(b);
    show_binrep(c);
    float f = 3.14;
    show_binrep(f);
}

Note that most common systems are little-endian, so the output of show_binrep(c)is notthe 1111111 011000101 you expect, because that's not how it's stored in memory. If you're looking for valuerepresentation in binary, then a simple cout << bitset<16>(c)works.

需要注意的是最常见的系统是小端,这样的输出show_binrep(c)没有的1111111 011000101你期望的,因为这不是它是如何存储在内存中。如果您正在寻找二进制的表示,那么一个简单的cout << bitset<16>(c)工作。

回答by sbi

Is there a standard way in C++ to show the binary representation in memory of a number [...]?

C++ 中是否有标准方法来显示数字 [...] 内存中的二进制表示?

No. There's no std::bin, like std::hexor std::dec, but it's not hard to output a number binary yourself:

不。没有std::bin, like std::hexor std::dec,但是自己输出一个数字二进制并不难:

You output the left-most bit by masking all the others, left-shift, and repeat that for all the bits you have.

您通过屏蔽所有其他位,左移并为您拥有的所有位重复此操作来输出最左边的位。

(The number of bits in a type is sizeof(T) * CHAR_BIT.)

(一个类型的位数是sizeof(T) * CHAR_BIT.)

回答by eudoxos

Similar to what is already posted, just using bit-shift and mask to get the bit; usable for any type, being a template (only not sure if there is a standard way to get number of bits in 1 byte, I used 8 here).

类似于已经发布的内容,只需使用位移和掩码来获取位;可用于任何类型,作为模板(只是不确定是否有标准方法来获取 1 字节中的位数,我在这里使用了 8)。

#include<iostream>
#include <climits>

template<typename T>
void printBin(const T& t){
    size_t nBytes=sizeof(T);
    char* rawPtr((char*)(&t));
    for(size_t byte=0; byte<nBytes; byte++){
        for(size_t bit=0; bit<CHAR_BIT; bit++){
            std::cout<<(((rawPtr[byte])>>bit)&1);
        }
    }
    std::cout<<std::endl;
};

int main(void){
    for(int i=0; i<50; i++){
        std::cout<<i<<": ";
        printBin(i);
    }
}

回答by Shital Shah

Reusable function:

可重复使用的功能:

template<typename T>
static std::string toBinaryString(const T& x)
{
    std::stringstream ss;
    ss << std::bitset<sizeof(T) * 8>(x);
    return ss.str();
}

Usage:

用法:

int main(){
  uint16_t x=8;
  std::cout << toBinaryString(x);
}

This works with all kind of integers.

这适用于所有类型的整数。

回答by WriteYour NameHere

#include <iostream> 
#include <cmath>       // in order to use pow() function
using namespace std; 

string show_binary(unsigned int u, int num_of_bits);

int main() 
{ 

  cout << show_binary(128, 8) << endl;   // should print 10000000
  cout << show_binary(128, 5) << endl;   // should print 00000
  cout << show_binary(128, 10) << endl;  // should print 0010000000

  return 0; 
}

string show_binary(unsigned int u, int num_of_bits) 
{ 
  string a = "";

  int t = pow(2, num_of_bits);   // t is the max number that can be represented

  for(t; t>0; t = t/2)           // t iterates through powers of 2
      if(u >= t){                // check if u can be represented by current value of t
          u -= t;
          a += "1";               // if so, add a 1
      }
      else {
          a += "0";               // if not, add a 0
      }

  return a ;                     // returns string
}

回答by Ratah

Using old C++ version, you can use this snippet :

使用旧的 C++ 版本,您可以使用以下代码段:

template<typename T>
string toBinary(const T& t)
{
  string s = "";
  int n = sizeof(T)*8;
  for(int i=n-1; i>=0; i--)
  {
    s += (t & (1 << i))?"1":"0";
  }
  return s;
}

int main()
{
  char a, b;

  short c;
  a = -58;
  c = -315;

  b = a >> 3;

  cout << "a = " << a << " => " << toBinary(a) << endl;
  cout << "b = " << b << " => " << toBinary(b) << endl;
  cout << "c = " << c << " => " << toBinary(c) << endl;
}

a = => 11000110
b = => 11111000
c = -315 => 1111111011000101

回答by user5673656

Using the std::bitset answers and convenience templates:

使用 std::bitset 答案和便利模板:

#include <iostream>
#include <bitset>
#include <climits>

template<typename T>
struct BinaryForm {
    BinaryForm(const T& v) : _bs(v) {}
    const std::bitset<sizeof(T)*CHAR_BIT> _bs;
};

template<typename T>
inline std::ostream& operator<<(std::ostream& os, const BinaryForm<T> bf) {
    return os << bf._bs;
}

Using it like this:

像这样使用它:

auto c = 'A';
std::cout << "c: " << c << " binary: " << BinaryForm{c} << std::endl;
unsigned x = 1234;
std::cout << "x: " << x << " binary: " << BinaryForm{x} << std::endl;
int64_t z { -1024 };
std::cout << "z: " <<  << " binary: " << BinaryForm{z} << std::endl;

Generates output:

生成输出:

c: A binary: 01000001
x: 1234 binary: 00000000000000000000010011010010
z: -1024 binary: 1111111111111111111111111111111111111111111111111111110000000000

回答by user5463518

Here is the true way to get binary representation of a number:

这是获得数字的二进制表示的真正方法:

unsigned int i = *(unsigned int*) &x;