.net C#检查整数中的特定数字是否仅为1或0

92dk7w1h  于 2023-01-06  发布在  .NET
关注(0)|答案(3)|浏览(280)

我有一个类型为yyyy00000的整数,如果第一个y是0,则y可以是1或0,第二个len是9而不是10
例如:
1111000000 111000000 0十亿一千一百万
它是整数类型。
检查第二个数字是1还是第一个数字的最佳方法是什么?
前四个都有意义
可以执行类似1111000000.ToString()[1] == '1'的操作
但是,如果我运行大量的数据,这将需要很长的时间来铸造刺痛。。有没有更快的方法来做到这一点?

waxmsbnn

waxmsbnn1#

但是,如果我运行大量的数据,这将需要很长的时间来铸造刺痛。。有没有更快的方法来做到这一点?
这类问题需要通过基准测试来回答,否则你会去优化那些不是问题的东西,因为你实际上并不知道问题是什么。
无论如何,也许您可以在这里节省几个ns,这意味着您可以节省的时间量很可能是由磁盘i/o而不是CPU时间来节流的,因为您说"这将花费太长时间",这只有在您试图解析几TB的整数时才有意义(每次解析为ns)...
快速benchmark.net测试结果

|         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;
    }
}
bvk5enib

bvk5enib2#

如果我没理解错的话,你可以有一个10位数的int型,也可以有一个9位数的int型,这取决于第一个y是1还是0。
如果是这种情况,你基本上有这两个选项:

  • 1年00万
  • 1yy000000(第一个y是0,但是int不能有一个前置的0,所以我们最终得到9位数而不是10位。

要确定第一个数字是1还是0,可以检查该值是否小于100000000:

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

8mmmxcuj3#

得到一个数的位数的最简单的方法是使用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);

相关问题