Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / base36 to base10 на Builder c++ 6 / 13 сообщений из 13, страница 1 из 1
17.08.2016, 13:52
    #39293281
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
вот тоже понадобилось по этой теме http://www.sql.ru/forum/1197517/perevesti-iz-base36-v-base10 перевести из base36 в base10
Но пока все, что находил, идет через числовой тип. 1Сникам хорошо, у них 32 цифры, вышеприведенный пример на аксесе тож работает, как я понимаю из-зи 28 разрядных чисел.
Чтож мне, на сиплюсплюсе шестого билдера делать?
...
Рейтинг: 0 / 0
17.08.2016, 13:55
    #39293284
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
didgik1Сникам хорошо, у них 32 цифры
Чо?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.08.2016, 13:57
    #39293288
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Dimitry Sibiryakov, 32-х разрядные числа
...
Рейтинг: 0 / 0
17.08.2016, 14:09
    #39293299
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Без числового никак. Т.к. перевод сводится к следующей математике:
Код: plaintext
1.
res = a0 + a1*N + a2*N^2 + a2*N^3... + ai*N^i


где ai разряд исходного числа в N-ричной системе счисления.
Т.е. каждый разряд исходного значения (ai*N^i) влияет на все разряды результата. Исключение если исходная и конечная системы счисления кратны, например 2=>16, 16=>2, но это не твой случай.
...
Рейтинг: 0 / 0
17.08.2016, 14:17
    #39293306
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
С математикой в Int32 войдет 6 разрядов base36, в Int64 - 12 разрядов, Double - 10.
...
Рейтинг: 0 / 0
17.08.2016, 14:55
    #39293336
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Dima T, ну да, а мне надо "000003GPD8OG3K84 перевести из BASE36 в BASE10, то получится AlcCode 0012665000001190180"
т.е. надо через длинную арифметику делать, или как оно там называется...
...
Рейтинг: 0 / 0
17.08.2016, 15:05
    #39293346
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
"000003GPD8OG3K84" это 16 разрядов BASE36
"AlcCode 0012665000001190180" - 19 разрядов BASE10
Первое не полезет во второе т.к. 36^16 > 10^19, т.е. в BASE36 может быть использовано не более 12 разрядов, остальные всегда будут нули. В общем бери UInt64 - его как раз хватает на весь диапазон AlcCode
...
Рейтинг: 0 / 0
17.08.2016, 15:15
    #39293359
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
didgikт.е. надо через длинную арифметику делать
Не обязательно, но таки да, так будет проще всего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.08.2016, 15:18
    #39293365
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Dima T, в Uint64 тоже не влезает же.
...
Рейтинг: 0 / 0
17.08.2016, 15:28
    #39293370
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
uint64_t from36(const char* val) {
	uint64_t res = 0;
	for(int i = 0; i < strlen(val); i++) {
		char c = val[i];
		uint64_t prev = res;
		if(c >= '0' && c <= '9') {
			res *= 36;
			res += c - '0';
		} else if (c >= 'A' && c <= 'X') {
			res *= 36;
			res += c - 'A' + 10;
		} else { // неиспользуемый символ
			break;
		}
		if(prev > res) { // переполнение
			res = 0;
			break;
		}
	}
	return res;
}

int main() {
	printf("%019llu\n", from36("000003GPD8OG3K84"));
	return 0;
}

...
Рейтинг: 0 / 0
17.08.2016, 15:29
    #39293371
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
didgikDima T, в Uint64 тоже не влезает же.
AlcCode влезает, т.к. 10^19 < 2^64
...
Рейтинг: 0 / 0
17.08.2016, 15:37
    #39293378
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
В принципе можешь какой-нибудь класс эмулирующий int128 взять, туда все полезет Тут например .
Но тут uint64 достаточно, т.к. 16 разрядов BASE36 не полезут в 19 разрядов BASE10 (AlcCode), т.е. потолок у тебя AlcCode, а он умещается в uint64.
...
Рейтинг: 0 / 0
17.08.2016, 16:25
    #39293407
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
base36 to base10 на Builder c++ 6
Dima T, да, влезает. Это я тупил посмотрев на хелп в билдере. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / base36 to base10 на Builder c++ 6 / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]