【问题标题】:How to read a binary number as input?如何读取二进制数作为输入?
【发布时间】:2014-10-15 23:22:44
【问题描述】:

有没有办法让用户在 C 或 C++ 中输入二进制数?

如果我们写类似的东西

int a = 0b1010;
std::cout << a << std::endl

然后输出为 10(使用适当的编译器扩展时)。

但是当我们尝试写作时

int n;
std::cin >> n;
int t = 0bn;

它给了我们一个错误,所以任何人都可以建议我们如何直接读取二进制数作为输入而不是使用字符串来存储输入?

【问题讨论】:

  • google 搜索,第一个条目:cplusplus.com/forum/general/103479
  • @Zaiborg 这就是我认为的问题所在。太糟糕了,他们没有bin IO 操纵器来搭配hexdecoct。也许我现在会尝试提出一个,因为二进制文字是一种标准的东西。

标签: c++ c input user-input c++14


【解决方案1】:

这里有点混乱,我们来解开一下。

  • 0b1010 是一个整数文字,一个常量,编译时整数值,以基数 2 写入。同样,0xA 是一个基数为 16 的文字,10 是以 10 为基数。所有这些都指的是同一个整数,这只是告诉编译器您指的是哪个数字的不同方式。在运行时,在内存中,此整数始终表示为以 2 为底的数字。

  • std::cout &lt;&lt; a;取a 的整数值并输出它的字符串表示形式。默认情况下,它以 10 为底输出,但您可以使用 std::hex 修饰符使其以 16 为底输出。没有预定义的修饰符以二进制形式打印。所以你需要自己做(或谷歌,这是一个常见的问题)。

  • 0b 最后,用于定义整数字面量。它不是运行时运算符。回想一下,所有ints 在内存中都表示为基数为 2 的数字。从机器的角度来看,其他基础不存在,intint,所以没有什么可以转换的。如果您需要从字符串中读取二进制数,则可以将反向代码滚动到打印它的位置(std::cin &gt;&gt; n 假设输入是基数为 10 的数字,因此如果输入实际上是打算在base 2中)。

【讨论】:

  • 我建议删除“在运行时,在内存中,此整数始终表示为以 2 为底的数字。”少量。这是不必要的错误。在运行时,数字只是一个数字。 (不是在运行时,它仍然只是一个数字。)除非您使用阴暗的技巧,否则您看不到程序使用的表示形式,并且知道表示形式无论如何它几乎是无用的。它不一定是base-2,实际上它实际上不是,不适用于任何主流编译器(二进制补码甚至不是基数系统,所以它怎么可能是base-2 ?)。
  • 鉴于 OP 想要以二进制形式打印它,我将其包含在内,大多数建议是使用按位运算来提取位。当然,这并不严格意味着它存储在 base-2 中,但强烈建议这样做。
  • @R.Martinho:关于 2 的补码不是纯基数系统的有趣小问题。不过它仍然是二进制的,除了符号位之外,它的位置值都是以 2 为底的。 (无论如何,我认为“二进制”是运行时表示的更好术语)。
  • (顺便说一句,ISO C 和 C++ 确实要求 unsigned 整数类型实际上是以 2 为基数,位按正常的位值顺序排列:它们以模 2^n 包装一些 n 其中 n 是该特定整数大小的值表示中的位数(N4140 第 3.9.1 节基本类型,第 4 项)。并且unsigned char 没有填充:所有对象位都是值表示位. (并且您可以转换为char* 以查看任何内容的表示)。三元硬件必须模拟...按顺序排列的req 来自将移位描述为实际移位的位,而不是*2
【解决方案2】:

虽然没有直接读取二进制数的函数,但有函数 strtox(其中 x 表示数据类型)将包含二进制数(或任何其他基数)的字符串转换为数值.

所以解决办法是先把数字读成字符串,然后再转换。

例子:

char input[100];
char *endpointer;

<read input using either C or C++ syntax>

int n = (int) strtol(input, &endpointer, 2);

【讨论】:

    【解决方案3】:

    将二进制数作为输入,我常用的有两种方式:

    (Key note:将输入作为字符串!!!使用:#include&lt;string&gt;)

    1. bitset库的bitset模板的to_ulong()方法
      • 为此,您需要使用 #include&lt;bitset&gt; 包含 bitset

    示例:

    string s;
    cin>>s; // Suppose s = "100100101"
    int n = (int) bitset<64>(s).to_ulong();
    cout<<n; // 293
    

    探索更多关于bitsethere和关于to_ulong()here的信息。

    1. string 库的stoi() 方法
      • 为此,您需要使用 #include&lt;string&gt; 包含 string

    示例:

    string s;
    cin>>s; // Suppose s = "100100101"
    int n = stoi(s, 0, 2);
    cout<<n; // 293
    

    探索stoi()here的格式。

    【讨论】:

      【解决方案4】:

      不如自己动手:

      uint32_t a = 0;
      
      char c;
      while ((c = getchar()) != '\n') { // read a line char by char
        a <<= 1;                        // shift the uint32 a bit left
        a += (c - '0') & 1;             // convert the char to 0/1 and put it at the end of the binary
      }
      
      printf("%u\n", a);
      

      【讨论】:

        猜你喜欢
        • 2021-09-17
        • 1970-01-01
        • 2011-02-20
        • 2010-12-08
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多