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

 
 
> преобразования из дополнительного кода в прямой, есть хитрый способ?
skopus
сообщение Feb 16 2006, 12:16
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



Я написал вот такую вот функцию, но она работает слишком медленно (132 цикла при отключенной оптимизации). Может быть есть какой-то лаконичный алгоритм? Или придется переписать по такому же принципу но на асме?

//возвращает модуль числа
//отрицательное число преобразутся из обратного кода в прямой
int SignedToUnsigned(int sgnval)
{
if ((sgnval&0x8000)==0x8000) //если старший бит =1, то число отрицательное, следовательно записано в дополнительном коде
{
sgnval -= 0x0001; //отнять младшую 1
//инверсия
if ((sgnval&0x0001)==0x0001) sgnval=sgnval&0xFFFE; // 1111 1111 1111 1110
else sgnval=sgnval|0x0001; // 0000 0000 0000 0001
if ((sgnval&0x0002)==0x0002) sgnval=sgnval&0xFFFD; // 1111 1111 1111 1101
else sgnval=sgnval|0x0002; // 0000 0000 0000 0010
if ((sgnval&0x0004)==0x0004) sgnval=sgnval&0xFFFB; // 1111 1111 1111 1011
else sgnval=sgnval|0x0004; // 0000 0000 0000 0100
if ((sgnval&0x0008)==0x0008) sgnval=sgnval&0xFFF7; // 1111 1111 1111 0111
else sgnval=sgnval|0x0008; // 0000 0000 0000 1000

if ((sgnval&0x0010)==0x0010) sgnval=sgnval&0xFFEF; // 1111 1111 1110 1111
else sgnval=sgnval|0x0010; // 0000 0000 0001 0000
if ((sgnval&0x0020)==0x0020) sgnval=sgnval&0xFFDF; // 1111 1111 1101 1111
else sgnval=sgnval|0x0020; // 0000 0000 0010 0000
if ((sgnval&0x0040)==0x0040) sgnval=sgnval&0xFFBF; // 1111 1111 1011 1111
else sgnval=sgnval|0x0040; // 0000 0000 0100 0000
if ((sgnval&0x0080)==0x0080) sgnval=sgnval&0xFF7F; // 1111 1111 0111 1111
else sgnval=sgnval|0x0080; // 0000 0000 1000 0000

if ((sgnval&0x0100)==0x0100) sgnval=sgnval&0xFEFF;
else sgnval=sgnval|0x0100;
if ((sgnval&0x0200)==0x0200) sgnval=sgnval&0xFDFF;
else sgnval=sgnval|0x0200;
if ((sgnval&0x0400)==0x0400) sgnval=sgnval&0xFBFF;
else sgnval=sgnval|0x0400;
if ((sgnval&0x0800)==0x0800) sgnval=sgnval&0xF7FF;
else sgnval=sgnval|0x0800;

if ((sgnval&0x1000)==0x1000) sgnval=sgnval&0xEFFF;
else sgnval=sgnval|0x1000;
if ((sgnval&0x2000)==0x2000) sgnval=sgnval&0xDFFF;
else sgnval=sgnval|0x2000;
if ((sgnval&0x4000)==0x4000) sgnval=sgnval&0xBFFF;
else sgnval=sgnval|0x4000;
if ((sgnval&0x8000)==0x8000) sgnval=sgnval&0x7FFF;
else sgnval=sgnval|0x8000;
}
return sgnval;
}

Сообщение отредактировал skopus - Feb 16 2006, 12:20
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Camelot
сообщение Feb 16 2006, 12:39
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



может вместо if сделайте побитовый xor c FFFF?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- skopus   преобразования из дополнительного кода в прямой   Feb 16 2006, 12:16
- - BVU   А зачем так длинно-то? http://ru.wikipedia.org/wik...   Feb 16 2006, 12:34
|- - prottoss   Х = abs(X)   Feb 16 2006, 12:46
- - zltigo   Цитата(skopus @ Feb 16 2006, 14:16) Я нап...   Feb 16 2006, 12:45
|- - skopus   Цитата(zltigo @ Feb 16 2006, 15:45) Цитат...   Feb 16 2006, 14:03
|- - defunct   Цитата(skopus @ Feb 16 2006, 16:03) Мы же...   Feb 16 2006, 14:13
- - Vic1   - бесконечно много раз Извинения всем! Но вто...   Feb 16 2006, 12:49
|- - BVU   Цитата(Vic1 @ Feb 16 2006, 15:49) Scopus ...   Feb 16 2006, 13:08
- - defunct   Цитатаint SignedToUnsigned(int sgnval) { if ((sgnv...   Feb 16 2006, 12:53
- - zltigo   Цитата(prottoss @ Feb 16 2006, 14:46) Х =...   Feb 16 2006, 12:56
|- - skopus   [quote name='zltigo' post='87847' date='Feb 16 200...   Feb 16 2006, 13:48
|- - defunct   Цитатаа сколько же он по-вашему занимает? 10 ? мож...   Feb 16 2006, 13:56
- - KRS   А почему просто унарный - нельзя использовать? re...   Feb 16 2006, 14:08
- - Vic1   Извините, skopus! Комичность ситуации привела ...   Feb 16 2006, 15:55
- - zltigo   Цитата(KRS @ Feb 16 2006, 16:08) А почему...   Feb 16 2006, 17:31


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

 


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


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