Ещё пару вопросов по Си

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Ещё пару вопросов по Си

Сообщение tiasur »

Предыдущий вопрос немного быбил меня из колеи и поэтому хочется перестраховаться:

1. Есть четыре безнаковых числа размером в один байт: А, В, С, Е. Нужно разместить их в одном четырех байтном числе в том же порядке, где А находится в MSB.

Моё решение:

Код: Выделить всё

unsigned int АВСЕ(UCHAR A, UCHAR B, UCHAR C, UCHAR E)
{
 unsigned int abce = 0;
 unsigned char *p;
    
 p = (unsigned char*)&abce;
 *p = E; 
 p++;

 *p = C; 
 p++;

 *p = B; 
 p++;

 *p = A; 

 return (abce); 
}
2. Найти ближайшее целое:

Код: Выделить всё

int round (float a)
{
   return (a + (float)0.5)
}
Есть ли косяки?
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: Ещё пару вопросов по Си

Сообщение ajkj3em »

#1 - не верно, msb может быть последним байтом на некоторых
платформах (intel x86, например), или быть вообше оказаться в
середине 4-х байтного числа (как в каком-то варианте pdp, если
меня не глючит). корректный код -

Код: Выделить всё

unsigned int v;
v = a;
v = (v << 8) | b;
v = (v << 8) | c;
v = (v << 8) | d;
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Re: Ещё пару вопросов по Си

Сообщение tiasur »

ajkj3em писал(а):#1 - не верно, msb может быть последним байтом на некоторых
платформах (intel x86, например), или быть вообше оказаться в
середине 4-х байтного числа (как в каком-то варианте pdp, если
меня не глючит). корректный код -

Код: Выделить всё

unsigned int v;
v = a;
v = (v << 8) | b;
v = (v << 8) | c;
v = (v << 8) | d;
В любом случае мне твой вариант нравится больше. Позже испытаю компилятором. Как насчёт следующей задачи?
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Re: Ещё пару вопросов по Си

Сообщение aldep »

tiasur писал(а): 2. Найти ближайшее целое:

Код: Выделить всё

int round (float a)
{
   return (a + (float)0.5)
}
Есть ли косяки?
Есть: a=-3 функция вернет -2
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Re: Ещё пару вопросов по Си

Сообщение tiasur »

Есть: a=-3 функция вернет -2
Точно :) Спасибо. А можно ли сделать поизящнее без if(a < 0)?
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Re: Ещё пару вопросов по Си

Сообщение aldep »

tiasur писал(а):
Есть: a=-3 функция вернет -2
Точно :) Спасибо. А можно ли сделать поизящнее без if(a < 0)?
Смотря, что значит поизящнее. Чтобы быстрее работала, можно написать так:

Код: Выделить всё

float half=0.5;
unsigned int sign=*((int*)&a) & 0x80000000;
int* pintHalf=(int*)(&half);
*pintHalf=*pintHalf + sign;
return a+half;

Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Особого смысла в такой оптимизации, если только не пишется Quake for PDA не вижу.
Читабельность кода важнее обычно, так что if (a<0) наиболее изящное с этой точке зрения, хотя и вероятно раза в 2 медленнее, чем код из предыдщего поста.
Ответить