Как получить последние 16 двоичных цифр отрицательного числа и связать их?

Я работаю с некоторыми побитовыми операторами, и я хочу извлечь последние 16 двоичных цифр числа и выполнить с ними операцию. Я в основном хочу увидеть отрицательный int, такой как 0xFFFFFFFF, а затем извлечь LSB FFFF и объединить их с 0, чтобы я получил ноль, чтобы он выглядел как 0x0000FFFF вместо этого. Меня интересуют только меньшие отрицательные числа, поэтому LSB должен быть всей необходимой мне информацией.

Вот мой подход в C:

#include <stdio.h>

int main(){
    int a = -1, c = 0;
    short b = (short)a;
    printf("a is %x\nb is %x",a,b);
    c = (0 << 16) | b;
    printf("\nc is %x\n", c); 
    return 0;
}

Мой мыслительный процесс заключался в том, что я могу преобразовать свой int a в короткий, чтобы он выглядел как FFFF вместо FFFFFFFF. У меня будет лучшее время. К сожалению для меня, это просто распечатывает ffffffff для переменных


person Tyler Kelly    schedule 02.02.2016    source источник
comment
приведение в (short)a не нужно, потому что любое более широкое значение будет автоматически усечено   -  person phuclv    schedule 02.02.2016
comment
@ LưuVĩnhPhúc, спасибо. Есть ли причина использовать краткую, когда речь идет о манипуляциях с битами?   -  person Tyler Kelly    schedule 02.02.2016
comment
это необходимо в некоторых случаях, но не в этом случае   -  person phuclv    schedule 02.02.2016


Ответы (1)


То, что у вас есть, не работает, потому что оператор побитового ИЛИ (|) устанавливает любой бит, который установлен в любом операнде.

Вы хотите использовать оператор побитового И (&), чтобы замаскировать ненужные биты. Это очищает любой бит, который очищен в любом операнде.

Измените это:

c = (0 << 16) | b;

К этому:

c = b & 0xFFFF;

И ваш результат будет:

a is ffffffff
b is ffffffff
c is ffff
person dbush    schedule 02.02.2016
comment
так что для 16 MSB я бы сказал c = b & 0xFFFF0000? - person Tyler Kelly; 02.02.2016
comment
@ user3470987 Почти. Это даст вам 0xFFFF0000. Если вы хотите 0x0000FFFF, вы должны сделать c = (unsigned int)(b & 0xFFFF0000) >> 16. Приведение необходимо для предотвращения возможности сдвига 1 битов слева. - person dbush; 02.02.2016