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

почему ~2 равно -3? Как это ~ работа оператор?

12 ответов


помните, что отрицательные числа хранятся в виде два!--5--> положительного двойника. В качестве примера приведем представление -2 в дополнении two: (8 бит)

1111 1110

способ получить это, взяв двоичное представление числа, взяв его дополнение (инвертирование всех битов) и добавив один. Два начинается как 0000 0010, и путем инвертирования битов мы получаем 1111 1101. Добавление одного дает нам результат выше. Первый бит знака, подразумевается негатив.

Итак, давайте посмотрим, как мы получаем ~2 = -3:

вот опять:

0000 0010

просто перевернуть все биты и мы получим:

1111 1101

Ну, а как выглядит -3 В дополнении к двум? Начните с положительного 3: 0000 0011, переверните все биты на 1111 1100 и добавьте один, чтобы стать отрицательным значением (-3), 1111 1101.

поэтому, если вы просто инвертируете биты в 2, Вы получаете представление дополнения двух -3.

оператор дополнения ( ~ ) просто переворачивает биты. Интерпретация этих битов зависит от машины.


~ переворачивает биты в значении.

почему ~2 is -3 связано с тем, как числа поразрядно. Числа представлены как два.

Итак, 2-двоичное значение

00000010

и ~2 переворачивает биты, поэтому значение теперь:

11111101

который является двоичным представлением -3.


как упоминали другие ~ просто перевернул биты (меняет один на ноль и ноль на один) и так как два!--10--> используется Вы получаете результат, который вы видели.

одна вещь, чтобы добавить почему используется дополнение two, это так, что операции с отрицательными числами будут такими же, как и с положительными числами. Подумайте о -3 как число, к которому 3 должен быть добавлен, чтобы получить ноль, и вы увидите, что это число 1101 помните, что двоичное сложение так же, как начальная школа (десятичное) сложение только вы носите один, когда вы получаете два, а не 10.

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.
1101 is -3, перевернуть биты вам 0010 это два.

эта операция является дополнением, а не отрицанием.

считайте, что ~0 = -1, и работайте оттуда.

алгоритм отрицания: "дополнение, приращение".

знаете ли вы? Существует также "дополнение", где обратные числа are симметричный, и он имеет как 0, так и -0.


int a=4; Система.из.println (~a); Результат будет :-5

' ~ ' любого целого числа в java представляет собой дополнение 1 к no. например, я беру ~4, что означает в двоичном представлении 0100. первый , длина целого числа-четыре байта, i.e 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 проверьте эту ссылку для видео https://youtu.be/w4pJ4cGWe9Y


Я знаю, что ответ на этот вопрос размещен давно, но я хотел бы поделиться своим ответом на то же самое.

для поиска дополнения одного числа сначала найдите его двоичный эквивалент. Вот, десятичное число 2 представлен 0000 0010 в двоичной форме. Теперь, принимая его дополнение, инвертируя (переворачивая все 1 в 0 и все 0 в 1) все цифры его двоичного представления, что приведет к:

0000 0010 → 1111 1101

это один дополнение десятичного числа 2. А так как первый бит, т. е. знаковый бит равен 1 в двоичном числе, то это означает, что знак отрицательный для номера, который он сохранил. (здесь число называют это не 2, но дополнение одного из 2).

теперь, поскольку числа хранятся как дополнение 2 (принимая дополнение одного числа плюс один), поэтому для отображения этого двоичного числа,1111 1101, в decimal, сначала нам нужно найти его дополнение 2, который будет:

1111 1101 → 0000 0010 + 1 → 0000 0011

это дополнение 2. Десятичное представление двоичного числа, 0000 0011, is 3. И, поскольку бит знака был один, как упоминалось выше, поэтому результирующий ответ -3.

подсказка: если вы внимательно прочтете эту процедуру, то вы бы заметили, что результатом для оператора дополнения one является фактически число (операнд - на котором применяется этот оператор) плюс один с отрицательным знаком. Вы можете попробуйте с другими числами.


просто ...........

в качестве дополнения 2 к любому числу мы можем вычислить, инвертируя все 1 на 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-битной машине.



побитовый оператор дополнения (~) - это унарный оператора.

Он работает в соответствии со следующими методами

сначала он преобразует заданное десятичное число в соответствующее бинарные значение.То есть в случае 2 он сначала преобразует 2 в 0000 0010 (в 8-битное двоичное число).

затем он преобразует все 1 в число 0, а все нули в 1;тогда число станет 1111 1101.

это 2-х представление дополнения -3.

чтобы найти значение без знака с помощью дополнения, т. е. просто преобразовать 1111 1101 в decimal (=4294967293), мы можем просто использовать %u во время печати.


Я думаю, что для большинства людей часть путаницы происходит от разницы между десятичным числом и подписанным двоичным числом, поэтому давайте сначала проясним это:

для человеческого десятичного мира: 01 означает 1, -01 означает -1, для бинарного мира компьютера: 101 означает 5, если он не подписан. 101 средства (-4 + 1), если подписан а подписана цифра в позиции X. | x

Итак, 2 перевернутый бит = ~2 = ~(010) = 101 = -4 + 1 = -3 путаница возникает из-за смешивания подписанного результата (101=-3) и результат unsinged(101=5)


Сначала мы должны разделить данную цифру на ее двоичные цифры, а затем обратить ее, добавив в последнюю двоичную цифру.После этого выполнения мы должны дать противоположный знак предыдущей цифре, которую мы находим complent ~2=-3 Объяснение: 2S двоичная форма 00000010 изменяется на 11111101 это одно дополнение, затем дополняется 00000010+1=00000011, который является двоичной формой трех и со знаком-то есть, -3


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

например ~2 приведет к -3.

Это потому, что битовый оператор сначала будет представлять число в знаке и величине, которая равна 0000 0010 (8-битный оператор), где MSB является битом знака.

затем позже он примет отрицательное число 2, которое равно -2.

-2 представлено как 1000 0010 (8 бит оператор) по знаку и величине.

позже он добавляет 1 к LSB (1000 0010 + 1), который дает вам 1000 0011.

Это -3.


Javascript tilde ( ~ ) coerces заданное значение для дополнения one-все биты инвертируются. Это все Тильды делает. Это не подпись. Он не добавляет и не вычитает никакого количества.

0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]

на стандартных настольных процессорах, использующих языки высокого уровня, такие как JavaScript, арифметика со знаком BASE10 является наиболее распространенной, но имейте в виду, что это не единственный вид. Биты на уровне ЦП подлежат интерпретации на основе ряда факторы. На уровне "кода", в данном случае JavaScript, они интерпретируются как 32-разрядное целое число со знаком по определению (оставим поплавки из этого). Подумайте об этом как о Кванте, эти 32-бит представляют собой множество возможных значений одновременно. Это полностью зависит от преобразующего объектива, через который вы их просматриваете.

JavaScript Tilde operation (1's complement)

BASE2 lens
~0001 -> 1110  - end result of ~ bitwise operation

BASE10 Signed lens (typical JS implementation)
~1  -> -2 

BASE10 Unsigned lens 
~1  -> 14 

все вышеперечисленное верно одновременно.