当前位置:  开发笔记 > 编程语言 > 正文

如何获得具有逐位运算的整数的第N位数?

如何解决《如何获得具有逐位运算的整数的第N位数?》经验,为你挑选了3个好方法。

例.123456,我们希望第三个从右边('4')出来.

实践中的想法是单独访问每个数字(即6 5 4 3 2 1).

C/C++/C#首选.



1> Greg Hewgill..:

更有效的实现可能是这样的:

char nthdigit(int x, int n)
{
    while (n--) {
        x /= 10;
    }
    return (x % 10) + '0';
}

如果您只需要其中一个数字,这可以节省将所有数字转换为字符串格式的工作量.而且,您不必为转换后的字符串分配空间.

如果速度是一个问题,你可以预先计算10的幂的数组并使用n索引到这个数组:

char nthdigit(int x, int n)
{
    static int powersof10[] = {1, 10, 100, 1000, ...};
    return ((x / powersof10[n]) % 10) + '0';
}

正如其他人所提到的,这就像你要对基数10进行按位运算一样接近.


第二种解决方案是速度最快的方式,避免字符串,浮点和循环.最佳回应IMO.
@KanagaveluSugumar将结果从整数转换为字符.对于ASCII,这相当于添加48("0"的字符代码).

2> Brannon..:

使用以10为底的数学:

class Program
{
    static void Main(string[] args)
    {
        int x = 123456;

        for (int i = 1; i <= 6; i++)
        {
            Console.WriteLine(GetDigit(x, i));
        }
    }

    static int GetDigit(int number, int digit)
    {
        return (number / (int)Math.Pow(10, digit - 1)) % 10;
    }
}

产生:

6
5
4
3
2
1



3> eselk..:

刚刚花时间在这里根据答案写这个,所以我想分享.

这是基于Brannon的答案,但一次可以让你获得多个数字.在我的例子中,我使用它从保存在int中的日期和时间中提取部分,其中数字是yyyymmddhhnnssm_s格式.

public static int GetDigits(this int number, int highestDigit, int numDigits)
{
    return (number / (int)Math.Pow(10, highestDigit - numDigits)) % (int)Math.Pow(10, numDigits);
}

我把它作为一个扩展,你可能不想,但这里是样本用法:

int i = 20010607;
string year = i.GetDigits(8,4).ToString();
string month = i.GetDigits(4,2).ToString();
string day = i.GetDigits(2,2).ToString();

结果:

年= 2001年

月= 6

天= 7

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有