【发布时间】:2008-09-22 21:46:19
【问题描述】:
我正在尝试将来自标准输入的 1 和 0 的传入字符串转换为它们各自的二进制值(其中诸如“11110111”之类的字符串将转换为 0xF7)。这看起来很简单,但我不想重新发明轮子,所以我想知道 C/C++ 标准库中是否有任何东西可以执行这样的操作?
【问题讨论】:
-
不是作业。我正在尝试嵌入一个转换器以便于将其读取到一组调试工具中,但我们所有的输入都是以字符串格式传递的。
我正在尝试将来自标准输入的 1 和 0 的传入字符串转换为它们各自的二进制值(其中诸如“11110111”之类的字符串将转换为 0xF7)。这看起来很简单,但我不想重新发明轮子,所以我想知道 C/C++ 标准库中是否有任何东西可以执行这样的操作?
【问题讨论】:
#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。
【讨论】:
1s 和0s 时才会出现问题。然后,您将超出long long 的范围。
您可以使用 std::bitset (如果您的位长度在编译时已知)
尽管使用某些程序,您可以将其分解成块并组合起来。
#include <bitset>
#include <iostream>
int main()
{
std::bitset<5> x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;
}
【讨论】:
你可以使用strtol
char string[] = "1101110100110100100000";
char * end;
long int value = strtol (string,&end,2);
【讨论】:
您可以使用 Boost Dynamic Bitset:
boost::dynamic_bitset<> x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;
【讨论】:
#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;
}
【讨论】: