Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以二进制形式打印(使用cout)数字?_C++_Binary_Iostream_Representation_Std Bitset - Fatal编程技术网

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

C++ 如何以二进制形式打印(使用cout)数字?,c++,binary,iostream,representation,std-bitset,C++,Binary,Iostream,Representation,Std Bitset,我正在学习一门关于操作系统的大学课程,我们正在学习如何从二进制转换为十六进制,从十进制转换为十六进制,等等。今天我们刚刚学习了有符号/无符号数字是如何使用二者的补码~number+1存储在内存中的 我们有一些书面练习要做,我希望在把作业交给老师之前能够验证我的答案。我写了一个C++程序,用于前几个练习,但是现在我要考虑如何用以下问题来验证我的答案: char a, b; short c; a = -58; c = -315; b = a >> 3; 我们需要显示a,b和c在内存

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

我们有一些书面练习要做,我希望在把作业交给老师之前能够验证我的答案。我写了一个C++程序,用于前几个练习,但是现在我要考虑如何用以下问题来验证我的答案:

char a, b;

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

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

我已经在纸上做过了,它给了我以下结果,在两个补码之后的数字的记忆中的所有二进制表示:

a=00111010这是一个字符,所以是一个字节

b=000011000这是一个字符,所以是一个字节

c=11111110011000101这是一个短的,所以是2个字节


有没有办法验证我的答案?是否有一个标准的方式在C++中显示二进制表示在一个数的内存中,或者我需要对每个步骤进行编码,我自己计算两个补码,然后转换成二进制数?我知道后者不会花那么长时间,但我很好奇是否有一种标准的方法可以做到这一点。

这就是你想要的吗

std::cout << std::hex << val << std::endl;

C++中有一种标准的方法来显示一个数字的二进制表示形式[[…]?< /P> >。 没有。没有std::bin,比如std::hex或std::dec,但自己输出二进制数字并不困难:

您可以通过屏蔽所有其他位来输出最左边的位,左移位,并对所有位重复该操作


类型中的位数为sizeofT*CHAR\u位

最简单的方法可能是创建一个表示值的流,然后将其流到cout


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

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

请注意,大多数常见的系统都是little endian,因此show_binrepc的输出不是您期望的1111111 011000101,因为它不是以这种方式存储在内存中的。如果您正在寻找二进制的值表示,那么一个简单的cout类似于已经发布的内容,只需使用位移位和掩码来获取位;可用于任何类型,仅作为模板不确定是否有标准方法获取1字节中的位数,我在这里使用8


使用实时转换到std::位集。没有临时变量,没有循环,没有函数,没有宏


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

unsigned int i = *(unsigned int*) &x;
可重用功能:

用法:


这和所有的整数都有作用。

使用旧的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

使用std::位集答案和方便模板:

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


在C++20中,您可以使用来执行以下操作:

unsigned char a = -58;
std::cout << std::format("{:b}", a);
同时,您可以使用std::format。{fmt}还提供了打印功能,使之更容易、更高效:


免责声明:我是{fmt}和C++20 std::format.的作者。

您了解十六进制表示法吗?如果你这样做了,你可以使用std::hex操纵器打印十六进制表示法-我将把它作为一个练习留给你来解决其余的问题…你在内存中强调了很多,但我希望他们没有让你处理endian问题。你知道endianness是什么吗?如果你这样做了,你会在意这个练习吗?这些问题的答案可能会影响您问题的答案。根据您的IDE,如果您只是希望验证手写解决方案的正确性,而不是实际编写程序来显示有用的内容,您可以使用Visual Studio的内存查看器之类的工具来查看内存的确切内容。例如,即使是Google也会这样做–但是+1表示希望自己在代码中找到如何实现它。请原谅我的无知,但这是否只会显示一个数字的二进制表示形式,例如8将是000011000,或者它的内存表示形式,例如通过处理符号位并使用两个补码来存储-8?Jesse:bitset的构造函数参数被解释为无符号值,其结果与两个补码的结果相同。严格地说,C++不能保证两个补码运算,而且在你的例子中,-58>3操作是不确定的。我可以在这个例子中把位元值IE,X或Y键入char *.nrnasasWAP:我想你可以把它投进去,但是结果不太有用。如果您需要结果作为字符串,请使用位集的to_字符串成员。谢谢Jerry,我在几分钟后发现了to_字符串。仅供参考,强制转换不起作用,比特集变量是一些看起来很神秘的比特集3ul的对象?!班最好让抽象来完成工作!获取每个字节的位数的标准方法是宏字符位。看来sbi编辑了Δξςaccord的帖子
对于@R.MartinhoFernandes的评论,我感到非常惊讶。然而,他没有改变最后一句话。我将进行编辑。主持人注:我试图有选择地清除这个答案下的敌对或非建设性评论,结果导致了一次非常破裂的对话。所有评论都被清除。请保持评论的专业性、建设性,最重要的是对主题的评论。如果OP想要删除这个,OP现在应该已经删除了。如果你不同意这个答案,那就投票吧。如果您可以改进此答案,请编辑。真的,我们都是成年人了,是吗?我几乎检查了这里所有评论的年龄,以确保每个人都超过13岁。不应该是int t=pow2,num_of_bits-1?不这只是将x复制到i中。除非你的意思是开玩笑?请注意,硬编码的大小是没有必要的。例如,要打印x,请使用:std::cout打印错误的位数。111000110是9位,不是8位。我犯了一个边界错误,请检查Visual Studio 2019中现在还没有STD::format,是吗?不是,但他们正在处理它。
unsigned int i = *(unsigned int*) &x;
#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
}
template<typename T>
static std::string toBinaryString(const T& x)
{
    std::stringstream ss;
    ss << std::bitset<sizeof(T) * 8>(x);
    return ss.str();
}
int main(){
  uint16_t x=8;
  std::cout << toBinaryString(x);
}
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
#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;
}

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;
c: A binary: 01000001
x: 1234 binary: 00000000000000000000010011010010
z: -1024 binary: 1111111111111111111111111111111111111111111111111111110000000000
unsigned char a = -58;
std::cout << std::format("{:b}", a);
unsigned char a = -58;
fmt::print("{:b}", a);