BYTE commands[255];
for(j =0; j <= 4; j++)
{
BYTE comm = commands[j];
comm ^= 0xFF;
Debug и Release Версии...в чем разница оптимизации?
Код:
commands достаточно вот чего будет, для теста: 0xf9, 0xf9, 0xf9, 0xfe,
Вот есть код:
Код:
tmp = ( ( ( (comm>>(2*j)) << 1 ) & 0x02 ) | ( (( comm>>(2*j) ) >> 1) & 0x01 ) );
И его вторая раздельная реализация:
Код:
BYTE tmp1;
tmp = comm>>(2*j);
tmp <<= 1;
tmp &= 0x02;
tmp1 =comm>>(2*j);
tmp1 >>= 1;
tmp1 &=0x01;
tmp |= tmp1;
tmp = comm>>(2*j);
tmp <<= 1;
tmp &= 0x02;
tmp1 =comm>>(2*j);
tmp1 >>= 1;
tmp1 &=0x01;
tmp |= tmp1;
И собственно конец цикла for
Код:
}
В Debug версии эти два кода работают одинаково, в Release, первая реализация работает не корректно.
ЗЫ: Среда: MS Visual C++ 6.0
У кого какие идеи будут на этот счет? Почему вдруг, оптимизация совершенно нерпавильная...?
Собственно оптимизации в Debug вообще нет, а в Release проблемы могут быть из-за того что оптимизатор мог посчитать некоторые выражения бессмысленными, просто необходимо пересмотреть реализацию.
Для теста ты предлагаешь четыре значения, а в цикле обрабатываешь их пять. Может, дело в этом?
После исправлений, мой вариант стал выглядеть вот так:
Код:
#include <windows.h>
int main(void)
{
BYTE commands[4] = { 0xf9, 0xf9, 0xf9, 0xfe };
for(BYTE j =0; j < 4; j++)
{
BYTE comm = commands[j];
comm ^= 0xFF;
// 1
BYTE tmp = ( ( ( (comm>>(2*j)) << 1 ) & 0x02 ) | ( (( comm>>(2*j) ) >> 1) & 0x01 ) );
printf("%i",tmp);
// 2
tmp = comm>>(2*j);
tmp <<= 1;
tmp &= 0x02;
BYTE tmp1 =comm>>(2*j);
tmp1 >>= 1;
tmp1 &=0x01;
tmp |= tmp1;
printf("%i",tmp);
}
}
int main(void)
{
BYTE commands[4] = { 0xf9, 0xf9, 0xf9, 0xfe };
for(BYTE j =0; j < 4; j++)
{
BYTE comm = commands[j];
comm ^= 0xFF;
// 1
BYTE tmp = ( ( ( (comm>>(2*j)) << 1 ) & 0x02 ) | ( (( comm>>(2*j) ) >> 1) & 0x01 ) );
printf("%i",tmp);
// 2
tmp = comm>>(2*j);
tmp <<= 1;
tmp &= 0x02;
BYTE tmp1 =comm>>(2*j);
tmp1 >>= 1;
tmp1 &=0x01;
tmp |= tmp1;
printf("%i",tmp);
}
}
В результате в релизе получил вывод 11220000. Пример тестировал на vs2005