Побитовый оператор НЕ, возвращающий неожиданное и отрицательное значение? [Дубликат]

0

Я пытаюсь получить значение целого числа, используя Побитовое NOT, но я не получаю ожидаемого.

#include <stdio.h>

int main(){
    int i = 16;
    int j = ~i;
    printf("%d", j);
    return 0;
}

Не должно быть 16:

00000000000000000000000000010000

Итак, ~ 16 предполагается:

11111111111111111111111111101111

Почему я не понимаю, чего я ожидал, и почему результат отрицательный?

Это то, что я пытаюсь сделать:

У меня есть номер для примера 27, который:

00000000000000000000000000011011

И хотите проверить каждый бит, если он 1 или 0.

Поэтому мне нужно получить пример этого значения

11111111111111111111111111110111

Используется второй, чтобы проверить, установлен ли третий бит первого в 1.

  • 2
    Что вы получаете?
  • 0
    Какой результат вы получаете и ожидаете получить?
Показать ещё 5 комментариев
Теги:
binary
bit-manipulation

4 ответа

0
Лучший ответ

И хотите проверить каждый бит, если он 1 или 0.

Чтобы проверить индивидуальный бит, вы не являетесь номером, вы И его с соответствующей битовой маской:

if ((x & 1) != 0) ... // bit 0 is 1
if ((x & 2) != 0) ... // bit 1 is 1
if ((x & 4) != 0) ... // bit 2 is 1
if ((x & 8) != 0) ... // bit 3 is 1
...
if ((x & (1 << n)) != 0) ... // bit n is 1
...
if ((x & 0x80000000) != 0) ... // bit 31 is 1
  • 0
    Большое спасибо. Это именно то, что я пытался сделать.
4

Хотя есть педантичные точки, которые могут быть сделаны относительно поведения компилятора, простой ответ заключается в том, что подписанный int с верхним набором бит является отрицательным числом.

Поэтому, если вы делаете то, что устанавливает верхний бит int (подписанный int, а не без знака), попросите инструменты/библиотеку показать вам значение этого int, вы увидите отрицательное число.

Это не универсальная правда, но это хорошее приближение к ней для большинства современных систем.

Обратите внимание, что здесь printf делает представление, потому что% d форматирует числа как подписанные. % u может дать результат, который вы ожидаете. Просто изменить типы переменных будет недостаточно, потому что printf ничего не знает о типах своих аргументов.

Я бы сказал, что в качестве общего эмпирического правила, если вы делаете бит-twiddling, используйте unsigned ints и отобразите их в шестнадцатеричном виде. Жизнь будет проще, и это, как правило, соответствует намерениям. (Необычные ускоренные математические трюки - очевидное исключение)

  • 0
    Вопрос отредактирован
  • 0
    Ваше редактирование не имеет смысла, так как компилятор будет видеть эти числа как огромные десятичные числа, а не как двоичные.
Показать ещё 1 комментарий
1

В арифметике с двумя дополнениями, чтобы получить число оборотов (для экзамена [для значения 16 для получения значения -16) вам нужно изменить каждый бит и добавить 1.

в вашем примере, чтобы получить - 16 из 16, который представлен как

00000000000000000000000000010000

вы не обратили внимание на каждый бит. Ты получишь

11111111111111111111111111101111

теперь вы должны добавить 1, и вы получите

11111111111111111111111111110000

Как вы можете видеть, если t добавить эти два значения, вы получите 0. Это доказывает, что вы все сделали правильно.

1

Если вы хотите получить дополнение к числу, вам нужно поместить это число в неподписанную переменную и показать ее как таковую. В C это будет:

unsigned int x = ~16;
printf("%u\n", x);

и вы получите 4294967279. Но если вы просто пытаетесь получить отрицательное число определенного, поставьте перед ним оператор -.

EDIT: для проверки, является ли бит 0 или 1, вы должны использовать побитовое И.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню