2015-08-24 6 views
1

Допустим, у меня есть целое число (32 бит), в котором хранится n-разрядное беззнаковое число (с n < 32). Как я могу преобразовать это эффективно в подписанную интерпретацию с использованием двух дополнений?Преобразование n целого числа из без знака в подпись

короткий пример пояснить, что я имею в виду:

int numUnsigned = 15; // Store a 4-bit value 0b1111 
int numSigned = ???; // Convert to 4-bit signed value using two's complement 
// Now numSigned should be -1, since 0b111 == -1 

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

+0

Как насчет расширения MSB (4-й) до бита 32? Это должно дать вам подписанное представление 4-го числа бит. –

+0

Немного неясно, откуда вы получаете 'n'. –

+0

@ Калеб Я знаю, что это не дополнение 2. Я просто не понял этот вопрос. –

ответ

3

Если я правильно понял ваш вопрос, вам просто нужно расширение знака, а не дополнение 2 (по крайней мере, согласно вашему комментарию во второй строке кода).

Если я правильно, вы можете сделать следующее (Предположим, у вас есть N цифр 0 < < N 32):

unsigned msb_mask = 1 << (N-1); // setup a mask for most significant bit 
numSigned = numUnsigned; 
if ((numSigned & msb_mask) != 0) // check if the MSB is '1' 
{ 
    numSigned |= ~(msb_mask-1); // extend the MSB 
} 

Может быть, я неправильно понял ваш вопрос ... Если это так, то просто игнорировать мои ответ.

EDIT

Предложил @harold:

numSigned = (numUnsigned^msb_mask)-msb_mask ; 
+0

Работает как шарм. – Boris

+0

Вы можете сделать это намного проще, но я не могу ответить больше – harold

+0

@Boris '(x^8) - 8' это все, что вам нужно – harold

Смежные вопросы