Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / логарифмирование по основанию два / 11 сообщений из 11, страница 1 из 1
02.05.2008, 23:21
    #35290847
акуз_варвар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
логарифмирование по основанию два
поццкажите, люди добрые, как число округлить в большую сторону до ближайшей степени двойки? если число не является степенью двойки.
...
Рейтинг: 0 / 0
03.05.2008, 04:14
    #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
03.05.2008, 10:55
    #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
06.05.2008, 13:50
    #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
06.05.2008, 14:22
    #35296955
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
логарифмирование по основанию два
ПалестинецКрутые ассемблерщики чтоли.. а про bsr никто не ф курсе?
Ну наконец-то. Нет, не в курсе. Кстати, развейте сомнение - для нуля и аргумента, уже являющегося степенью двойки, этот код отработает верно?
...
Рейтинг: 0 / 0
07.05.2008, 03:44
    #35298419
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
логарифмирование по основанию два
...
Рейтинг: 0 / 0
14.05.2008, 13:31
    #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
14.05.2008, 17:55
    #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
19.05.2008, 19:58
    #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
20.05.2008, 12:08
    #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
20.05.2008, 12:11
    #35322838
bsr
bsr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
логарифмирование по основанию два
ага, и всё тот же цикл
bsr - отличное решение
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / логарифмирование по основанию два / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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