2016-01-03 3 views
0

я наткнулся на этом методе, который должен сделать основу преобразование из 10 базы в радиксе основания, так, например, если я прохожу 28, 16 он должен вернуть 1c, который является шестнадцатеричным представлением десятичного 28C# базовый конвертер

private static string convertTo(long value, int radix) 
{ 
    char[] alphabet = "abcdefghijklmnopqrstuv".ToCharArray(); 
    string result = ""; 

    if (value < radix) { 
     return alphabet[value].ToString(); 
    } 

    long index; 
    while (value != 0) 
    { 
     index = value % radix; 
     value = Convert.ToInt64(Math.Floor(value/radix)); 
     result += alphabet[index].ToString(); 
    } 
    return result; 
} 

Я переписывание той части программы в PHP. Читая код, приведенный выше, и предсказания выхода вручную, она возвращает c1, где он должен возвращать 1c для 28, 16

Мой вывод заключается в том, что этот метод возвращает перевернутое представление строки в данной базе, c1 вместо правильного 1c

Поскольку у меня нет компилятора C#, я не смог проверить мои выводы.

Так вот мои два вопроса:

  1. ли мои расчеты правильно, что указанный выше способ calld с 28, 16 возвращается c1?
  2. Я полагаю, символы (цифры/алфавиты), в любом основании, написано так, что базовые показатели уменьшаются на 1 , как мы идем слева написать, так, например, в десятичной представления означают 300 (3 * 10^2) + 10 (1 * 10^1) + 2 (2 * 10^0) .. это абсолютновсегда правильный?
+0

@GeraldSchneider правильно, и это перевернутый c1 (который, я считаю, является возвратом этого метода выше). Если это все правильно, я бы использовал strrev (base_convert (28, 10, 16)) для достижения этого эффекта. но я не уверен в своих выводах, и это вопрос :) – rahmanisback

+0

Существует несколько бесплатных компиляторов C#, включая Visual Studio Community. Что мешает вам проверить это? – Jeff

+0

@Jeff У меня нет Windows, и я не могу использовать VS. И без VS мне придется обернуть эту функцию в классе, чтобы проверить ее, но у меня нет этого навыка с C#. – rahmanisback

ответ

2
  1. Для меня да. фрагмент в C# (как он есть) должен возвращать C1, а не 1C. Вам нужно будет отменить строку результат, прежде чем возвращать его. (или использовать вместо этого что-то вроде result = string.Concat(alphabet[index].toString()); при создании результата)

  2. Это правильно. Он также работает во всех других баз, то есть если мы возьмем ваш пример (28), вы будете иметь:

28 = 2 * 10^1 + 8 * 10^0 (база 10)

28 = * 16^1 + * 16^0 (основание 16) =

28 = * 8^1 + * 8^0 (базовая 8) =

и т.д., и т.д.

1

Да, что код должен отменить выход. Ниже приведены результаты, когда я запускал этот код в Visual Studio 2015 и соответствующий вывод в окне Locals.

var ret1 = convertTo(28, 16); 
    var ret2 = convertTo(28, 10); 
    var ret3 = convertTo(10, 10); 

    ret1 "c1" string 
    ret2 "82" string 
    ret3 "01" string 
1

Да, вы правильно convertTo(28, 16) == c1 Петля в коде должно быть:

while (value != 0) 
{ 
    index = value/radix; // implicit integer division 
    value = value % radix; 
    result += alphabet[index].ToString(); 
} 

Что касается вашего второго вопроса, я считаю, что правильным также - это больше для эксперта математики проверить хотя ,

+0

Поскольку 'value/radix' уже является' long', потому что C# определяет перегрузки 'operator /', которые выполняют целочисленное деление, вы должны избавиться от 'Convert.ToInt64 (Math.Floor (' . –

+0

Thanks @JeppeStigNielsen, который проскальзывает – norlesh

+0

Вы также должны удалить часть 'Math.Floor'! –

Смежные вопросы