Как работает побитовый оператор дополнения (~ тильда)?

Почему ~ 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