Страница 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 медленнее, чем код из предыдщего поста.