реклама на сайте
подробности

 
 
> Сдвиг 64битного беззнакового целого
coolibin
сообщение Jul 1 2009, 09:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Есть код:

CODE

#define UINT unsigned int
#define UINT64 unsigned long long
....
UINT64 iValue;
UINT iOffset;

iOffset = rand()&63;
iValue = (UINT64)(1) << iOffset;


компилятор генерит такой асм:

CODE

_BLF rand,??rand??rT
LSLS R2,R0,#+26
LSRS R2,R2,#+26
MOVS R0,#+1
MOVS R1,#+0
_BLF ??lllsl_t,??rT??lllsl_t


т. е. он юзает функцию lllsl_t для сдвига. Как заставить его обойтись без этой функции, т. е. через простые операции, если это конечно, возможно?


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
coolibin
сообщение Jul 1 2009, 10:58
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



да, я это знаю, но увы по замыслу она не может быть константой

Cделать циклом что ли?
Код
iOffset = rand()&63;
iValue = 1;
while(iOffset){
    iValue = iValue << 1;
    iOffset--;
}


Сообщение отредактировал coolibin - Jul 1 2009, 10:59


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 1 2009, 11:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(coolibin @ Jul 1 2009, 14:58) *
Cделать циклом что ли?

Зачем? Вы же единицу сдвигаете, сделайте так:
Код
    UINT vl = 0, vh = 0;

    iOffset = rand()&63;
    if(iOffset < 32) vl = 1UL << iOffset;
    else vh = 1UL << (iOffset - 32);
    iValue = ((UINT64)vh << 32) | vl;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01352 секунд с 7
ELECTRONIX ©2004-2016