Преобразование из величины знака в дополнение к двум - PullRequest
1 голос
/ 24 сентября 2011

Для этого назначения я могу использовать только базовые побитовые операторы и никаких управляющих структур, поэтому я до сих пор придумал этот код для преобразования величины знака в дополнение к двум .

int sm2tc(int x) {
    // Invert and add 1
    // Problem: sm has 2 zeros.. 1000...000 & 0000...000
    int tmin = 1 << 31;
    int mask = x >> 31;  // Determine sign of x
    int mask2 = ~tmin; // Negate tmin to get 0111111...
    int first = (x ^ mask) + (~mask + 1) ;
    int second = first & mask2; // Turns of MSB
    return second;
}

Где я ошибся?

1 Ответ

2 голосов
/ 24 сентября 2011

Итак, что вы действительно хотите вычислить, это

result = (x & sign_bit) ? -(x & ~sign_bit) : x;

Но, конечно, вам не разрешены управляющие структуры.Первый шаг - переписать -(x & ~sign_bit), используя только операторы + и ^: (-1 ^ (x & ~sign_bit)) - -1.Теперь обратите внимание, что если (x & sign_bit) равно нулю, то (0 ^ (x & ~sign_bit)) - 0 равно x.Теперь у нас есть

result = (x & sign_bit) ? (-1 ^ (x & ~sign_bit)) - -1 : (0 ^ (x & ~sign_bit)) - 0

Затем вам нужно просто заменить -1 и 0 функциями x, которые генерируют эти значения в зависимости от знака, и вот, обе стороныусловие становится тем же выражением, и условие становится ненужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...