Почему ~ 2 равно -3? Как ~
работу оператора?
Как работает побитовый оператор дополнения (~ тильда)?
Ответ 1
Помните, что отрицательные числа сохраняются как два дополнения положительного аналога. В качестве примера здесь представлено представление -2 в двух дополнениях: (8 бит)
1111 1110
Как вы это понимаете, беру двоичное представление числа, используя его дополнение (инвертируя все биты) и добавляя его. Два запускаются как 0000 0010, а путем инвертирования бит мы получаем 1111 1101. Добавляя один, мы получаем результат выше. Первый бит - бит знака, подразумевающий отрицательный.
Итак, посмотрим, как получится ~ 2 = -3:
Здесь еще два:
0000 0010
Просто переверните все биты, и мы получим:
1111 1101
Хорошо, что -3 похоже в двух дополнениях? Начните с положительного 3: 0000 0011, переверните все биты до 1111 1100 и добавьте один, чтобы стать отрицательным значением (-3), 1111 1101.
Итак, если вы просто инвертируете биты в 2, вы получаете два дополнительных представления -3.
Оператор дополнения (~) JUST FLIPS BITS.
Это означает, что машина должна интерпретировать эти биты.Ответ 2
~
переворачивает биты в значении.
Почему ~2
-3
связано с тем, как числа представляются поразрядно. Числа представлены как два дополнения.
Итак, 2 - это двоичное значение
00000010
И ~ 2 переворачивает биты, поэтому значение теперь:
11111101
Который является двоичным представлением -3.
Ответ 3
Как уже упоминалось, ~
просто перевернутые биты (меняются один на ноль и нуль на один), и поскольку используется два дополнения, вы получаете результат, который вы видели.
Одна вещь, которую нужно добавить, - это использование двух дополнений, так что операции с отрицательными числами будут такими же, как и на положительных числах. Подумайте о -3
как о числе, к которому нужно добавить 3
, чтобы получить нуль, и вы увидите, что это число 1101
, помните, что двоичное добавление подобно тому, как начальная школа (десятичная) добавка только вы переносите один, когда вы получаете до двух, а не 10.
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
Поэтому 1101
есть -3
, переверните биты, которые вы получите 0010
, который равен двум.
Ответ 4
Эта операция является дополнением, а не отрицанием.
Рассмотрим, что ~ 0 = -1, и работаем оттуда.
Алгоритм отрицания - это "дополнение, приращение".
Знаете ли вы? Существует также "одно дополнение", где обратные числа являются симметричными и имеют как 0, так и a -0.
Ответ 5
Я знаю, что ответ на этот вопрос отправлен долго назад, но я хотел поделиться своим ответом на то же самое.
Для того, чтобы найти число, дополняющее число, сначала найдите его двоичный эквивалент. Здесь десятичное число 2
представляется как 0000 0010
в двоичной форме. Теперь его дополнение дополняет инвертирование (переключение всех 1s на 0s и все 0s на 1s) на все цифры его двоичного представления, что приведет к:
0000 0010 → 1111 1101
Это дополнение к десятичному числу 2. И так как первый бит, т.е. знаковый бит равен 1 в двоичном числе, это означает, что знак отрицательный для числа его сохраняются. (здесь упомянутое число не 2, но дополнение к 2).
Теперь, поскольку числа хранятся как дополнение 2s (беря число, дополняющее число плюс один), чтобы отобразить это двоичное число, 1111 1101
, в десятичное число, сначала нам нужно найти его дополнение 2s, которое будет быть:
1111 1101 → 0000 0010 + 1 → 0000 0011
Это дополнение 2s. Десятичное представление двоичного числа 0000 0011
равно 3
. И так как бит знака был таким, как указано выше, поэтому итоговый ответ -3
.
Подсказка: Если вы внимательно прочитали эту процедуру, вы бы заметили, что результат для оператора дополнения - это фактически число (операнд - на котором этот оператор применяется) плюс один с отрицательный знак. Вы можете попробовать это и с другими номерами.
Ответ 6
int a = 4; System.out.println(~ а); Результатом будет: -5
'~' любого целого числа в java представляет собой 1 дополнение к no. например, я беру ~ 4, что означает в двоичном представлении 0100. первый, длина целого числа равна четырем байтам, то есть 4 * 8 (8 бит за 1 байт) = 32. Таким образом, в системной памяти 4 представляется 0000 0000 0000 0000 0000 0000 0000 0100 теперь оператор ~ будет выполнять 1 дополнение на указанном выше двоичном no
i.e 1111 1111 1111 1111 1111 1111 1111 1011- > 1 дополнение самый старший бит представляет знак no (либо - или +), если он равен 1, тогда знак "-" если оно равно 0, то знак равен + согласно нашему результату это отрицательное число, в java отрицательные числа хранятся в форме 2 дополнений, полученный результат мы должны преобразовать в 2 дополнения (сначала выполнить 1 дополнение и просто добавить 1 к 1 дополнению). все они станут нулями, за исключением наиболее значимого бита 1 (который является нашим знаковым представлением числа, что означает, что для оставшихся 31 бит 1111 1111 1111 1111 1111 1111 1111 1011 (полученный результат оператора ~) 1000 0000 0000 0000 0000 0000 0000 0100 (1 дополнение)
1 (2 дополнения)
1000 0000 0000 0000 0000 0000 0000 0101 теперь результат -5 посмотрите эту ссылку для видео < [Бит-мудрые операторы в java] https://youtu.be/w4pJ4cGWe9Y
Ответ 7
Просто...........
Как 2 дополнение любого числа, которое мы можем вычислить, инвертируя все 1s на 0 и наоборот, добавляя к нему 1.
Здесь N = ~ N всегда дает результаты - (N + 1). Потому что система хранит данные в форме 2 дополнения, что означает, что он хранит ~ N, как это.
~N = -(~(~N)+1) =-(N+1).
Например:
N = 10 = 1010
Than ~N = 0101
so ~(~N) = 1010
so ~(~N) +1 = 1011
Теперь укажите, откуда идет Минус. Мое мнение состоит в том, что у нас есть 32-битный регистр, что означает 2 ^ 31 -1 бит, задействованный в работе, и для оставления одного бита, который изменяется в более раннем вычислении (дополнении), хранящемся как знаковый бит, который обычно равен 1. И получим результат как ~ 10 = -11.
~ (-11) = 10;
Вышеуказанное верно, если printf ( "% d", ~ 0); получаем результат: -1;
Но printf ( "% u", ~ 0), чем результат: 4294967295 на 32-битной машине.
Ответ 8
Оператор побитового дополнения (~) является оператором унарного.
Он работает следующим образом
Сначала он преобразует заданное десятичное число в соответствующий двоичный код Значение. В случае 2 сначала конвертируется от 2 до 0000 0010 (до двоичного числа 8 бит).
Затем он преобразует все 1 в число в 0 и все нули в 1, а затем число станет 1111 1101.
что является 2-дополняющим представлением -3.
Чтобы найти значение без знака с использованием дополнения, т.е. просто для преобразования 1111 1101 в десятичный (= 4294967293) мы можем просто использовать% u во время печати.
Ответ 9
Я думаю, что для большинства людей путаница состоит из разницы между десятичным числом и подписанным двоичным числом, поэтому сначала прояснить его:
для человеческого десятичного мира: 01 означает 1, -01 означает -1, для компьютерного двоичного мира: 101 означает 5, если оно не указано. 101 означает (-4 + 1), если знак подписан, а знак со знаком находится в позиции x. | х
так что 2 перевернутый бит = ~ 2 = ~ (010) = 101 = -4 + 1 = -3 путаница возникает из-за смешивания подписанного результата (101 = -3) и неокончательного результата (101 = 5)
Ответ 10
Сначала мы должны разбить данную цифру на ее двоичные цифры, а затем отменить ее, добавив в последнюю двоичную цифру. После этого выполнения мы должны дать противоположный знак предыдущей цифре, которую мы находим, ~ 2 = -3 Объяснение: 2s двоичная форма - 00000010 изменяется на 11111101, это дополнение, затем соответствует 00000010 + 1 = 00000011, который является двоичной формой из трех и с -sign I.e, -3
Ответ 11
Побитовый оператор является унарным оператором, который работает по методу знака и величины в соответствии с моим опытом и знаниями.
Например, ~ 2 приведет к -3.
Это связано с тем, что бит-мудрый оператор сначала будет представлять число в знаке и величине, которое является 0000 0010 (8-разрядный оператор), где MSB является знаковым битом.
Затем позже потребуется отрицательное число 2, равное -2.
-2 представляется в виде 1000 0010 (8-разрядный оператор) в знаке и величине.
Позже он добавляет 1 к LSB (1000 0010 + 1), который дает вам 1000 0011.
Что такое -3.
Ответ 12
Javascript tilde (~) заставляет заданное значение одному дополнению - все биты инвертируются. Это все тильда. Это не значит, что он подчёркивает. Он не добавляет и не вычитает никакого количества.
0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]
На стандартных настольных процессорах, использующих языки высокого уровня, такие как JavaScript, стандартная арифметика BASE10 является самой распространенной, но имейте в виду, что это не единственный вид. Биты на уровне ЦП подлежат интерпретации на основе ряда факторов. На уровне "code" в этом случае JavaScript они интерпретируются как 32-разрядное целое число со знаком по определению (пусть из этого выйдет floats). Подумайте об этом как о кванте, эти 32-биты представляют собой множество возможных значений сразу. Это зависит полностью от конвертирующей линзы, которую вы просматриваете.
JavaScript Tilde operation (1 complement)
BASE2 lens
~0001 -> 1110 - end result of ~ bitwise operation
BASE10 Signed lens (typical JS implementation)
~1 -> -2
BASE10 Unsigned lens
~1 -> 14
Все вышесказанное верно одновременно.
Ответ 13
В основном, действие - это дополнение, а не отрицание.
Здесь x = ~ x дают результаты - (x + 1) всегда.
х = ~ 2
- (2 + 1)
-3