Цитата(Visor @ Mar 27 2008, 11:09)

Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1),
На подавляющем большинстве современных процессоров "unsigned int" будет занимать 4 байта, что делать с оставшимися 2мя байтами из "unsigned int"? И как нужно сравнивать - на равенство или на больше/меньше?
Цитата
слово из этих байтов является "unsigned int". Как это красиво сделать?
Лучше спроси сколькими способами это можно сделать
(Предполагаю, что сравнивать нужно "unsigned short" - оно как раз 2 байта)
Код
unsigned short val2check; // Это сравниваем
unsigned char val2cmp[2]; // То, с чем сравниваем
typedef struct {
unsigned char s1;
unsigned char s2;
} S2;
typedef union {
unsigned short sh;
unsigned char ch[2];
S2 s2;
} U3;
void compare(void)
{
U3 u3;
unsigned short sh;
// 1й способ
u3.sh=val2check;
if (u3.s2.s1==val2cmp[0] && u3.s2.s2==val2cmp[1]) ...
// 2й способ
u3.sh=val2check;
if (u3.ch[0]==val2cmp[0] && u3.ch[1]==val2cmp[1]) ...
// 3й способ
u3.sh=val2check;
if (memcmp(u3.ch,&val2cmp,sizeof(val2cmp)==0) ...
// 4й способ
if (memcmp(&val2check,&val2cmp,sizeof(val2cmp)==0) ...
// 5й способ
if ((val2check&0xFF)==val2cmp[0] && ((val2check>>8)&0xFF)==val2cmp[1]) ...
// 6й способ
if ( ((unsigned char*)&val2check)[0]==val2cmp[0] && ((unsigned char*)&val2check)[1]==val2cmp[1]) ...
// 7й способ
u3.s2.s1=val2cmp[0];
u3.s2.s2=val2cmp[1];
if (u3.sh==val2check) ...
// 8й способ
u3.ch[0]=val2cmp[0];
u3.ch[1]=val2cmp[1];
if (u3.sh==val2check) ...
// 9й способ
memcpy(u3.ch,val2cmp,sizeof(val2cmp));
if (u3.sh==val2check) ...
// 10й способ
sh=val2cmp[0]|(val2cmp[1]<<8);
if (sh==val2check) ...
// 11й способ
((unsigned char*)&sh)[0]=val2cmp[0];
((unsigned char*)&sh)[1]=val2cmp[1];
if (sh==val2check) ...
// 12й способ
if (*(unsigned short*)val2cmp == val2check) ...
}
Можно наверное и еще способов придумать, но надеюсь этих хватит