powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / логарифмирование по основанию два
11 сообщений из 11, страница 1 из 1
логарифмирование по основанию два
    #35290847
акуз_варвар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поццкажите, люди добрые, как число округлить в большую сторону до ближайшей степени двойки? если число не является степенью двойки.
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35290899
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-нибудь типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 function  Up_To_Power_2 (N: cardinal): cardinal;
 asm 
  mov  edx, eax
  tst  eax, eax
  jz   @exit
   xor   ecx, ecx
@loop:
  inc  ecx
   shr   eax,  1 
  jnz  @loop
   xor   eax, eax
  inc  eax
   shl   eax, cl
   shr   eax,  1 
  cmp  eax, edx
  je   @exit
   shl   eax,  1 
@exit:
 end ;

(само собой, набрано в форуме и вообще ожидаются гнилые бананы)
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35290936
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Медленно :-)

Код: 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.
27.
 function  Up_To_Power_2 (N: cardinal): cardinal;
 asm 
         dec eax

         mov edx, eax
          shr  edx,  1 
          or  eax, edx  

         mov edx, eax
          shr  edx,  2 
          or  eax, edx  

         mov edx, eax
          shr  edx,  4 
          or  eax, edx  

         mov edx, eax
          shr  edx,  8 
          or  eax, edx  

         mov edx, eax
          shr  edx,  16 
          or  eax, edx  

         inc eax
 end ;



________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35296852
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крутые ассемблерщики чтоли.. а про bsr никто не ф курсе?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
__forceinline int BSR(
    unsigned int _Op1
  )
{  
  __asm 
  {
    bsr eax, _Op1  
  } 
}
int  Up_To_Power_2 (int N)
{
  return  1  << (BSR(N) +  1 )
}
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35296955
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПалестинецКрутые ассемблерщики чтоли.. а про bsr никто не ф курсе?
Ну наконец-то. Нет, не в курсе. Кстати, развейте сомнение - для нуля и аргумента, уже являющегося степенью двойки, этот код отработает верно?
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35298419
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35311621
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ПалестинецКрутые ассемблерщики чтоли.. а про bsr никто не ф курсе?
Ну наконец-то. Нет, не в курсе. Кстати, развейте сомнение - для нуля и аргумента, уже являющегося степенью двойки, этот код отработает верно?
нет конечно.. ifчек надо. типа

Код: plaintext
1.
2.
3.
4.
5.
6.
int  Up_To_Power_2 (int N)
{
  if (N&(N- 1 )) 
    return  1  << (BSR(N) +  1 )
  else
    return N
}
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35312658
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПалестинецКрутые ассемблерщики чтоли.. а про bsr никто не ф курсе?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
__forceinline int BSR(
    unsigned int _Op1
  )
{  
  __asm 
  {
    bsr eax, _Op1  
  } 
}
int  Up_To_Power_2 (int N)
{
  return  1  << (BSR(N) +  1 )
}


Это только если есть эта инструкция, в RISC наборе ее нет.
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35321808
Quartz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, все уже перешли на асм? Опять я все пропустил...
Код: plaintext
1.
2.
3.
4.
5.
 function  RoundUpToPowerOf2(value : Integer) : Integer;
 begin 
   Result:= 1 ;
    while  (Result<value)  do  Result:=Result  shl   1 ;
 end ;
Может и медленно, зато верно... :-)
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35322828
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Quartz
Код: plaintext
1.
2.
3.
4.
5.
 function  RoundUpToPowerOf2(value : Integer) : Integer;
 begin 
   Result:= 1 ;
    while  (Result<value)  do  Result:=Result  shl   1 ;
 end ;


Смысл тот-же. Подсчёт количества ведущих нулевых битов. Только с обратной стороны
...
Рейтинг: 0 / 0
логарифмирование по основанию два
    #35322838
bsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bsr
Гость
ага, и всё тот же цикл
bsr - отличное решение
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / логарифмирование по основанию два
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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