这是什么功能,我的意思是0x30的部分?指向ASCII表的十六进制值? 这可能是基本的东西,而且我目前没有知识。
getCompleteCode("11111");
private string getCompleteCode(string code)
{
var b1 = 10;
var b2 = 20;
var sum = 0;
for (var i = code.Length - 1; i >= 0; i--)
{
var z = code[i] - 0x30;
sum = sum + (z + b1) * b2;
}
Console.WriteLine(sum);
return code;
}
答案 0 :(得分:3)
一个不应该实现逻辑的一个很好的例子:
// why not static?
private string getCompleteCode(string code)
{
// what does "b1" as well as "b2" stand for?
var b1 = 10;
var b2 = 20;
var sum = 0;
// the reason for the loop being in reversed order?
for (var i = code.Length - 1; i >= 0; i--)
{
// the question put - what does 0x30 stand for - it's ascii code of '0' char
// so, why magic code 0x30 instead of evident '0'?
var z = code[i] - 0x30;
sum = sum + (z + b1) * b2;
}
// what if I want to compute it in, say, WinForms??
// Never mix business logic (computing some code) and UI (output)
Console.WriteLine(sum);
// we've done a lot of stuff just to return the initial input??
return code;
}
我对实施的建议(假设code
保证是正确的输入):
//TODO: think on a better name for the method
private static int getCompleteCode(string code) {
return code.Sum(c => (c - '0' + 10) * 20);
}
...
Console.WriteLine(getCompleteCode("11111"));
答案 1 :(得分:1)
0x30是' 0'的ascii值。 ...它通常用于从字符中减去,例如' 8' - 在转换为整数之后(0x30 = 8)(隐式或显式地像这里)。
答案 2 :(得分:1)
正如其他人所解释的那样,var z = code[i] - 0x30
是获取数字字符值的标准代码。正如Glorin Oakenfoot所提到的,这段代码不做任何边界检查。所以它适用于'0' - 0x30(实际上,那是'0' - '0',顺便说一句),以及'9' - 0x30。但它也会产生像'A'这样的奇怪 - 0x30 = 32。
格洛林的评论也是对的 - 其余的数字似乎都是针对具体情况的。它似乎可能是一个哈希函数 - 它为给定的字符串计算一个主要唯一的数字。我将引导您完成循环,但它正在做的事情没有任何真正的意义。而不是输入“11111”,让我们看看“12345”:
第一次循环:i = 4,代码[i] ='5',z = 5,sum = 0 + 15 * 20 = 300
第二次循环:i = 3,代码[i] ='4',z = 4,sum = 300 + 14 * 20 = 580
第3次循环:i = 2,代码[i] ='3',z = 3,sum = 580 + 13 * 20 = 840
第4次循环:i = 1,代码[i] ='2',z = 2,sum = 840 + 12 * 20 = 1080
第5次循环:i = 0,代码[i] ='1',z = 1,sum = 1080 + 11 * 20 = 1300
正如我所提到的,它可能用于散列。您输入的每个数字字符串都可能具有唯一的整数代码。散列字符串可以提高效率。如果没有别的,它会给你一个相当强大的测试比较。见https://en.wikipedia.org/wiki/Hash_function
当然,大多数字符串哈希函数都不会从数字转换为int。如果函数要求输入只是数字,正如转换为int所暗示的那样,此字符串的最简单的散列就是将其解析为整数。
这让我想起的另一件事是尝试将整数字符串解析为数字。这将非常相似,但请注意以下差异:
var sum = 0
for (var i = 0; i < code.Length; i++)
{
var z = code[i] - '0' // this is the same as - 0x30, but more clear to read
sum = sum * 10 + z
}
考虑到函数的名称,它似乎更有可能是作为哈希函数。
答案 3 :(得分:0)
0x30 y数字0的十六进制ASCII码,因此z实际上会给出数字类型的数字。
答案 4 :(得分:-1)
删除小数。它=无论数字四舍五入。