Сложная оптимизация кода / алгоритма (например, упрощение) - PullRequest
2 голосов
/ 18 марта 2011

Как этот код может быть упрощен?

<code>
  if      (x == 0) x = 1;
  else if (x == 1) x = 0;
  else if (x == 2) x = 3;
  else if (x == 3) x = 2;

Ответы [ 15 ]

15 голосов
/ 18 марта 2011

Если x всегда между 0 и 3, попробуйте следующее:

x ^= 1;

Переключает младший значащий бит.

Если x может быть значением, отличным от 0 до 3, тогдаВы можете сначала проверить это:

if (x >= 0 && x <= 3) {
    x ^= 1;
}
9 голосов
/ 18 марта 2011

Это самая простая форма :

if      (x == 0) x = 1;
else if (x == 1) x = 0;
else if (x == 2) x = 3;
else if (x == 3) x = 2;

подождите ... это именно ваш код.

загадочные лайнеры НЕ простые.

5 голосов
/ 18 марта 2011

Чтобы использовать нотацию псевдокода, возможно:

if (x % 2 == 0) x = x + 1
   else x = x - 1

например, вы добавляете единицу, если это четное число, в противном случае вычитаете?С точки зрения оптимизации, я не вижу, что особенно медленно или неправильно с вашим исходным кодом.

5 голосов
/ 18 марта 2011

Вы можете использовать что-то вроде этого:

int mymap[4] = {1,0,3,2};

и затем в вашем коде используйте это:

x = mymap[x];
2 голосов
/ 19 марта 2011
x ^= x & ~3 == 0 ? 1 : 0;

К сожалению, мой код был настолько упрощен, что не смог сделать минимум 30 символов ...

2 голосов
/ 18 марта 2011

Не то, чтобы я думал, что это проще, и это не ограничивает случай 0..3, но:

x += (x % 2 == 0) ? 1 : -1; 
2 голосов
/ 18 марта 2011
if(x >= 0 && x <= 3)
  if((x%2) != 0) //odd
    x--;
  else if((x%2) == 0) //even
    x++;
1 голос
/ 19 марта 2011
if ( x >>> 2 == 0 )
{   x ^= 1;
}
1 голос
/ 18 марта 2011

один вкладыш:

x=(x==0)?1:((x==1)?0:(x==2)?3:(x==3)?2:x);
1 голос
/ 18 марта 2011
if( 0 <= x && x <= 3 )
  x ^= 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...