C++ 将十六进制或十进制字符串转换为C+中的long-long+;
我有一个处理字符串的代码,比如“19485”或“10011010”或“AF294EC”C++ 将十六进制或十进制字符串转换为C+中的long-long+;,c++,binary,hex,long-integer,C++,Binary,Hex,Long Integer,我有一个处理字符串的代码,比如“19485”或“10011010”或“AF294EC” long-long-toDecimalFromString(字符串值,格式){ 长dec=0; 对于(int i=value.size()-1;i>=0;i--){ char ch=在(i)处的值; int val=int(ch); 如果(ch>='0'&&ch如果不处理减号,它将不会处理自身。 检查它,记住你所看到的事实。然后,在 结尾,如果您看到一个'-'作为第一个字符,则取否定 结果 其他要点: 您不
long-long-toDecimalFromString(字符串值,格式){
长dec=0;
对于(int i=value.size()-1;i>=0;i--){
char ch=在(i)处的值;
int val=int(ch);
如果(ch>='0'&&ch如果不处理减号,它将不会处理自身。
检查它,记住你所看到的事实。然后,在
结尾,如果您看到一个'-'
作为第一个字符,则取否定
结果
其他要点:
- 您不需要(也不想)使用
pow
:它只是
results=格式*结果+数字
每次通过
- 您确实需要验证您的输入,确保数字
您获得的在基地是合法的(并且您没有任何
其他奇数字符)
- 您还需要检查溢出
- 您应该使用
isdigit
和isalpha
(或islower
和
isupper
)用于字符检查
- 您应该使用例如
val-=“0”
(而不是48
)作为您的
从字符代码到数字值的转换
- 您应该使用
[i]
,而不是(i)
处的来阅读个人信息
字符。使用常用的开发选项编译,以及
如果发生错误,您将得到崩溃,而不是异常
但您可能应该使用迭代器,而不是索引
通过字符串。它更地道
您几乎可以肯定地接受大小写
对于字母,也可能跳过前导空格
从技术上讲,也不能保证字母
角色是有序的,相邻的。实际上,我想你
可以将其用于'A'-'F'
范围内的字符(或
'a'-'f'
,但这是将字符转换为数字的最可靠的方法
是使用表查找。您需要知道指定的数字是被解释为有符号的还是无符号的(换句话说,是“ffffffff”-1还是4294967295?)。
如果有符号,则要检测负数,请测试最高有效位。如果设置了ms位,则在按照您的方式转换数字(生成无符号值)后,取1的补码(按位求反,然后添加1)
注意:要测试ms位,您不能只测试前导字符。如果数字是有符号的,“ff”应该是-1还是255?。您需要知道预期结果的大小(如果是32位有符号的,那么“FFFFFF”是负数,或者-1。但是如果是64位有符号的,“ffffffff”是正数,或者是4294967295)。因此,“ffffffff”的例子有不止一个正确答案
您可以只测试无符号结果是否大于结果范围的“中间点”(例如,32位数字为2^31-1),而不是测试ms位
long long toDecimalFromString(string value, Format format){
long long dec = 0;
for (int i = value.size() - 1; i >= 0; i--) {
char ch = value.at(i);
int val = int(ch);
if (ch >= '0' && ch <= '9') {
val = val - 48;
} else {
val = val - 55;
}
dec = dec + val * (long long)(pow((int) format, (value.size() - 1) - i));
}
return dec;
}