C#如果整数中的特定数字仅为1或0,请检查该数字



如果第一个y是0,则类型为yyyy000000y的整数可以是1或0,len是9而不是10

例如:

111100000011100000001010000000

这是一种内部

检查第二位是1还是第一位的最佳方法是什么?

前四个中的每一个都意味着某种

可以做一些类似1111000000.ToString()[1] == '1'的事情

但如果我运行大量数据,将需要很长时间才能进行强制转换。。有什么更快的方法吗?

,但如果我在大量数据上运行,则需要很长时间才能强制转换为字符串。。有什么更快的方法吗?

这类问题需要用基准来回答。否则,你就要优化那些不是问题的东西,因为你实际上并不知道问题是什么

在任何情况下,也许你可以在这里节省几个ns,这意味着你可以节省的时间可能是由磁盘i/o而不是CPU时间来限制的,因为你说"它将花费太长的时间";,只有当你试图解析几TB的整数(每次解析ns(时,这才有意义。。。

快速基准网测试结果

|         Method |       Mean |     Error |    StdDev |
|--------------- |-----------:|----------:|----------:|
| ToStringMethod | 18.5890 ns | 0.3854 ns | 0.4587 ns |
|  ConvertMethod | 12.8943 ns | 0.0984 ns | 0.0821 ns |
| SubtractMethod |  0.2576 ns | 0.0288 ns | 0.0283 ns |

解释:简单的减法/比较是您想要的解决方案,如另一个答案所述。


示例基准代码,这只是";足够接近";出于测试目的,但代码并不能解决您的问题。

public class WorkTest
{
private readonly int _data;
public WorkTest()
{
_data = new Random().Next(1000000, 1111000000);
}
[Benchmark]
public bool ToStringMethod() => _data.ToString()[1] == '1';
[Benchmark]
public bool ConvertMethod() => (ConvertBase10As2(_data) & 0x10000000) > 0;
[Benchmark]
public bool SubtractMethod() => _data > 111000000 ? (_data - 1000000000 > 0) : (_data - 100000000 > 0);
private int ConvertBase10As2(int b10)
{
int result = 0;
int shift = 0;
while (b10 > 0)
{
result |= (b10 & 1) << shift;
b10 /= 10;
shift++;
}
return result;
}
}

如果我正确理解你的问题,你可以有一个10位数的int或9位数的int,这取决于第一个y是1还是0。

如果是这样的话,你基本上有这两个选项:

  • 1yyy000000
  • 1y000000(第一个y是0,但int不能有在0之前,所以我们最后得到的是9位数字,而不是10位

要判断第一个数字是1还是0,可以检查值是否小于1000000000:

if (x < 1000000000) {
// First digit is 0
} else {
// First digit is 1
}

获取数字位数的最简单方法是使用ToString()。但最佳解决方案是将数字除以。。。

//get first digit
int i=123456789;
while (i >= 10)
i /= 10;
Console.WriteLine(i);
//get second digit
int i1=123456789;
while (i1 >= 100)
i1 /= 10;
Console.WriteLine(i1%10);
//third digit
int i2=123456789;
while (i2 >= 1000)
i2 /= 10;
Console.WriteLine(i2% 10);

最新更新