【问题标题】:Converting string of 1s and 0s into binary value将 1 和 0 的字符串转换为二进制值
【发布时间】:2008-09-22 21:46:19
【问题描述】:

我正在尝试将来自标准输入的 1 和 0 的传入字符串转换为它们各自的二进制值(其中诸如“11110111”之类的字符串将转换为 0xF7)。这看起来很简单,但我不想重新发明轮子,所以我想知道 C/C++ 标准库中是否有任何东西可以执行这样的操作?

【问题讨论】:

  • 不是作业。我正在尝试嵌入一个转换器以便于将其读取到一组调试工具中,但我们所有的输入都是以字符串格式传递的。

标签: c++ c binary


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char * ptr;
    long parsed = strtol("11110111", & ptr, 2);
    printf("%lX\n", parsed);
    return EXIT_SUCCESS;
}

对于更大的数字,有long long 版本strtoll。

【讨论】:

  • 这看起来很对。我唯一关心的是非常大的字符串,现在考虑一下,无论如何可能需要一些自定义代码。
  • 除了 strtol 之外,还有用于“long long”整数的 walk(两个 L)。
  • 啊,现在我明白你的意思了。只要生成的数字适合 long 或 long long 整数,字符串长度应该不是问题。
  • 只有当您的二进制字符串长于 64 个1s 和0s 时才会出现问题。然后,您将超出long long 的范围。
【解决方案2】:

您可以使用 std::bitset (如果您的位长度在编译时已知)
尽管使用某些程序,您可以将其分解成块并组合起来。

#include <bitset>
#include <iostream>

int main()
{
    std::bitset<5>  x(std::string("01011"));

    std::cout << x << ":" << x.to_ulong() << std::endl;
}

【讨论】:

    【解决方案3】:

    你可以使用strtol

    char string[] = "1101110100110100100000";
    char * end;
    long int value = strtol (string,&end,2);
    

    【讨论】:

      【解决方案4】:

      您可以使用 Boost Dynamic Bitset:

      boost::dynamic_bitset<>  x(std::string("01011"));
      std::cout << x << ":" << x.to_ulong() << std::endl;
      

      【讨论】:

        【解决方案5】:
        #include <iostream>
        #include <stdio.h>
        #include <string>
        
        using namespace std;
        
        string getBinaryString(int value, unsigned int length, bool reverse) {
            string output = string(length, '0');
            if (!reverse) {
                for (unsigned int i = 0; i < length; i++) {
                    if ((value & (1 << i)) != 0) {
                        output[i] = '1';
                    }
                }
            }
            else {
                for (unsigned int i = 0; i < length; i++) {
                    if ((value & (1 << (length - i - 1))) != 0) {
                        output[i] = '1';
                    }
                }
            }
            return output;
        }
        
        unsigned long getInteger(const string& input, size_t lsbindex, size_t msbindex) {
            unsigned long val = 0;
            unsigned int offset = 0;
            if (lsbindex > msbindex) {
                size_t length = lsbindex - msbindex;
                for (size_t i = msbindex; i <= lsbindex; i++, offset++) {
                    if (input[i] == '1') {
                        val |= (1 << (length - offset));
                    }
                }
            }
            else { //lsbindex < msbindex
                for (size_t i = lsbindex; i <= msbindex; i++, offset++) {
                    if (input[i] == '1') {
                        val |= (1 << offset);
                    }
                }
            }
            return val;
        }
        
        int main() {
            int value = 23;
            cout << value << ": " << getBinaryString(value, 5, false) << endl;
            string str = "01011";
            cout << str << ": " << getInteger(str, 1, 3) << endl;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-12
          • 1970-01-01
          • 2016-01-01
          • 2017-04-25
          • 1970-01-01
          • 2013-01-09
          • 1970-01-01
          • 2013-03-24
          • 2019-11-24
          相关资源
          最近更新 更多