Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Tyler KellyОтветов: 1

Я работаю с некоторыми побитовыми операторами, и я хочу извлечь последние 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 для переменных

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

cintbit-manipulationbit-shiftbitwise-operators

Ответы

Ответ 1 · рейтинг 5 · dbush

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

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

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

c = (0 << 16) | b;

К этому:

c = b & 0xFFFF;

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

a is ffffffff
b is ffffffff
c is ffff

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы