|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.09.2014, 13:06 | #1 |
Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
бинарная длина целого числа
Доброго времени суток уважаемые форумчане.
есть число X, как мы знаем в памяти оно хранится как набор единиц и нулей например 13 это 1101 и т д задача: узнать положение ближайшей единицы, то-есть, четвертая с конца, значит бинарный размер = 4 предполагаю что делается на asm, благо в делфи его можно прикручивать. пытался сделать через trunc(log2(abs(x))+1), работало, но использование функций, работающих с ieee745 или как его там, к сожалению запрещено, подскажите, как можно найти позицию единички? заранее благодарю |
05.09.2014, 13:22 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
подсчитайте сколько раз можно поделить на 2 без остатка.
|
05.09.2014, 13:25 | #3 |
Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
это конечно гениально и я бы никогда не додумался, но работает это медленно и подход не верный. реализация уже есть, но для чисел, типа in64 достаточно больших работает медленно, да и использовать деление, когда я уверен что можно просто как то прочесть память, не совсем правильный подход. была бы задача столь тривиальной, я бы не спрашивал, в asm-е кто нибудь тут разбирается?
|
05.09.2014, 13:48 | #4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Biohazard, как это может долго работать?!!
Код:
|
05.09.2014, 13:58 | #5 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Цитата:
Там есть и алгоритм перевертывания данных + алгоритм поиска наиболее старшего бита. |
|
05.09.2014, 14:02 | #6 | |
Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
Цитата:
Код:
|
|
05.09.2014, 14:03 | #7 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
__asm {
BSR rax, [N] INC rax MOV [k], rax } |
05.09.2014, 14:20 | #8 |
Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
Спасибо, в асме я не силён, компилятор делфей ругается, может что то не так применяю?
Код:
Последний раз редактировалось Biohazard; 05.09.2014 в 14:23. |
05.09.2014, 14:31 | #9 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
то что я написал, оно для х64
для 32х бит (если N 64-х битное) можно как-то так LEA edx, [N] CMP DWORD PTR [edx+4], 0 JZ nohigh BSR eax, [edx+4] ADD eax, 33 JMP done nohigh: BSR eax, [edx] INC eax done: ; MOV [k], eax Последний раз редактировалось f.hump; 05.09.2014 в 14:43. Причина: ошибочко |
05.09.2014, 14:36 | #10 |
Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
эх, на первую строку ругается, говорит [Error] Unit1.pas(38): Invalid register combination ну и т д, ладно, всё равно спасибо, попытаюсь дальще сам додуматься)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
округление числа до целого | johny_03 | PHP | 1 | 16.04.2014 08:51 |
Изъятие из целого числа нулей | Sting95 | Помощь студентам | 2 | 31.03.2014 10:02 |
Угадывании целого числа | vonavi98 | Помощь студентам | 0 | 15.01.2014 19:22 |
Visual Basic: Описать функцию DigitN (K, N) целого типа, возвращающую N-ю цифру целого положительного числа К | Екатерина23 | Помощь студентам | 1 | 10.12.2013 09:25 |
Вывести числа целого неотр. числа | Gonzo | Помощь студентам | 11 | 04.05.2010 16:55 |