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
How to print (using cout) a number in binary form?
提问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
, b
and 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::bitset
representing 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
. 没有临时变量,没有循环,没有函数,没有宏。
#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::hex
or std::dec
, but it's not hard to output a number binary yourself:
不。没有std::bin
, like std::hex
or 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;