确定任何进制的位值

4
我正在寻找一个函数,可以根据数字和进制确定其所代表的值。例如,
给定:
Whole Value: 1120
Base: 10
Place: Tens place
应返回:2
有人知道这个数学公式吗?
编辑:该函数还应以数字方式传递整个值,而不是像“e328fa”之类的字符串。返回值也应为数字,因此FindInPlace(60(整数部分),16(基数),2(位数,从1开始))应返回3。

你打算如何将位置输入函数中?例如,如果我想要获取0x3AF中的第一个数字,我可以调用get_value_of_place(0x3AF, 16, 256)吗? - Pesto
位置可以通过两种方式之一指定。在我给出的示例中,您可以将其作为2(第二个位置)传递,或者只需简单地使用10。 - Dan
5个回答

3
如果数字已经被转换为整数(即10进制),则:
// Supports up to base 36
char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char FindPlace(int number, int base, int digit)
{
   if(digit < 0) return 0;

   // Essentially divide the number by [base] to the [digit] power
   for(i=0; i<digit; i++)
   {
      number /= base;      
   }

   // TODO: Verify that the digit is in range of digits    
   return digits[number % base];
}

(0表示最右边的数字,1表示次右边的数字,以此类推)
我将数字返回为char,以允许使用超过10进制的基数。
请注意,如果您希望允许用户将所需数字输入为“个位数”、“十位数”、“百位数”或“个位数”、“十六位数”、“256位数”,只需执行以下操作:
digit = log(PlaceValue, base);

或者重写代码成为

char FindPlace(int number, int base, int digitAsBaseToAPower)
{
    // TODO: Error checking
    return digits[(number / digitAsBaseToAPower) % base];
}

我应该明确指出,该数字是以数值形式传递而不是字符串表示法。我编辑了问题以反映这一点。 - Dan

3
int getPlace(float x, float place) {

    return (int)(x/place) % 10;
}

这适用于十进制,并且可以处理小数点左右的位数。您可以像这样使用它:

place = getPlace(1120,10);
otherPlace = getPlace(0.1120,1e-3);

一个通用的任意进制解决方案比较复杂。我建议采用字符串解决方案。

3

使用以1为基数的索引,公式如下:

placeval = floor(number / (base^(place-1))) mod base

在Python中:

def FindInPlace(number, base, place):
    return number//base**(place-1) % base

完美。双斜杠是用来做什么的? - Dan
双斜杠是“地板除法”。它相当于int(floor(a/b)),而无需进行任何中间浮点数运算。 - Theran

1

像这样吗?

int place_value(int value, int base, int place)
{
    int value_in_place= value;
    for (int place_index= 1; place_index<place; ++place_index)
    {
        value_in_place/=base;
    }

    return value_in_place % base;
}

其中place是您从右侧想要的数字的基于1的索引。


你确定这是基于一的索引吗?我认为 place_value(10, 10, 1) 将返回 1,而不是 0... - Daniel LeCheminant
是的,我使用那个没有得到预期的行为。 - Scottie T
好的,修复很容易;只需简单地写成 for(int place_index=1;...) - Daniel LeCheminant
place_value(1120,10,1) 返回 2。我认为你的基数因素有误。 - Scottie T
哎呀,我应该说是从零开始的索引。我的错。 - MSN
这也是一个很好的答案。我希望我能将多个答案设置为我正在寻找的答案。 - Dan

0

下面的方法placeValue返回一个字符,因为11-36进制有大于9的数字。该方法需要:

  • int value: 整数值
  • int base: 将整数转换为的进制数;可接受的值为2-36
  • int place: 数字的索引;最低有效位的索引为1

import java.math.BigInteger;

...

    private static char placeValue(int value, int base, int place) {
        BigInteger bigValue = BigInteger.valueOf(value);
        String baseString = bigValue.toString(base);
        int numDigits = baseString.length();
        int digitIndex = numDigits - place;
        char digit = baseString.charAt(digitIndex); 
        return digit;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接