Я написал вот такую вот функцию, но она работает слишком медленно (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&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