Я пытаюсь получить значение целого числа, используя Побитовое 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.
И хотите проверить каждый бит, если он 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
Хотя есть педантичные точки, которые могут быть сделаны относительно поведения компилятора, простой ответ заключается в том, что подписанный int с верхним набором бит является отрицательным числом.
Поэтому, если вы делаете то, что устанавливает верхний бит int (подписанный int, а не без знака), попросите инструменты/библиотеку показать вам значение этого int, вы увидите отрицательное число.
Это не универсальная правда, но это хорошее приближение к ней для большинства современных систем.
Обратите внимание, что здесь printf делает представление, потому что% d форматирует числа как подписанные. % u может дать результат, который вы ожидаете. Просто изменить типы переменных будет недостаточно, потому что printf ничего не знает о типах своих аргументов.
Я бы сказал, что в качестве общего эмпирического правила, если вы делаете бит-twiddling, используйте unsigned ints и отобразите их в шестнадцатеричном виде. Жизнь будет проще, и это, как правило, соответствует намерениям. (Необычные ускоренные математические трюки - очевидное исключение)
В арифметике с двумя дополнениями, чтобы получить число оборотов (для экзамена [для значения 16 для получения значения -16) вам нужно изменить каждый бит и добавить 1.
в вашем примере, чтобы получить - 16 из 16, который представлен как
00000000000000000000000000010000
вы не обратили внимание на каждый бит. Ты получишь
11111111111111111111111111101111
теперь вы должны добавить 1, и вы получите
11111111111111111111111111110000
Как вы можете видеть, если t добавить эти два значения, вы получите 0. Это доказывает, что вы все сделали правильно.
Если вы хотите получить дополнение к числу, вам нужно поместить это число в неподписанную переменную и показать ее как таковую. В C это будет:
unsigned int x = ~16;
printf("%u\n", x);
и вы получите 4294967279
. Но если вы просто пытаетесь получить отрицательное число определенного, поставьте перед ним оператор -.
EDIT: для проверки, является ли бит 0 или 1, вы должны использовать побитовое И.