Страница 1 из 1

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

Добавлено: 25 мар 2007, 12:20
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)
}
Есть ли косяки?

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

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

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

unsigned int v;
v = a;
v = (v << 8) | b;
v = (v << 8) | c;
v = (v << 8) | d;

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

Добавлено: 25 мар 2007, 14:52
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;
В любом случае мне твой вариант нравится больше. Позже испытаю компилятором. Как насчёт следующей задачи?

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

Добавлено: 26 мар 2007, 10:11
aldep
tiasur писал(а): 2. Найти ближайшее целое:

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

int round (float a)
{
   return (a + (float)0.5)
}
Есть ли косяки?
Есть: a=-3 функция вернет -2

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

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

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

Добавлено: 26 мар 2007, 10:44
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;


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