Я дополняю 1 и дополняю 2

Почему в этом коде:

int a = 2, b = 0, c = 0;
c = -a; // resultado c = -2
c = ~b; // resultado c = -1

Почему в первом случае c=-2 и во втором c=-1?

12
задан 22.07.2016, 00:00
3 ответа

1. Оператор -

Этот оператор простой, просто ты получаешь ту же стоимость, менявшую знак. Если он положительный, перейди в негатив; и если он отрицательный, перейди в позитив.

Из-за которого в твоем случае -a где a=2 результат -a=-2

2. Оператор ~ что называется bitwise complement

Это более интересно. То, что делает этот оператор, состоит в том, чтобы обмениваться представлением в бинарном числа. А именно, давайте помещать как пример ~2:

  • 2 в бинарном: 0000 0010
  • мы делаем подкачку Ваших бит (все 0 в 1 и все 1 в 0) результат: 1111 1101 что является представлением в бинарном -3.
  • Из-за которого ~2 = -3

Давайте идти в твой конкретный случай, который ~0

  • мы уезжаем 0 что в бинарном: 0000 0000
  • Мы обмениваемся всеми битами: 1111 1111 что является представлением в бинарном -1.
  • Из-за которого ~0 = -1

У тебя есть больше документация операторов здесь (для java).

Чтобы заканчивать просто комментировать, что, как они говорят в этом ответе первоначального SO:

Оператор bitwise (~) ТОЛЬКО ОБМЕНИВАЕТСЯ БИТАМИ. Зависит от машины интерпретировать их.

Почему я это комментирую? В простой вид оператор ~ он состоит в том, чтобы изменять просто знак и уменьшать его 1. А именно:

~x = -x - 1

Я представляю себе то, что где-то здесь шел твой вопрос. Но зависит от компьютера интерпретация бит оператора ~ не всегда это тот же самый.

Но как говорит Пол Варгас в чате:

Так как вопрос, приклей этикетку с , в он не существует unsigned

То, что значит, что в он не был бы должен оказываться редкий (что да они есть, например, в , когда он занимается с unsigned - смотрите это соединение)

16
ответ дан 24.11.2019, 13:50
  • 1
    2 en binario es: 0000 0010 Ну, в действительности один int в Java занимает 32 бита - но это не изменяет ответ. –  leonbloy 19.07.2016, 15:23
  • 2
    @leonbloy S и # 237; но я свел к 8 бит после того, как не являюсь необходим в этом примере:) –  Miquel Coll 19.07.2016, 16:16

В первом ассигновании c = -a; ты используешь символ "меньше" чтобы отрицать число, содержавшее в a из-за которого стоимость c это будет негатив a:-2. Это эквивалент, который нужно умножать за-1.

Во втором случае ты используешь оператор отрицания на уровне бита ~ также названный "тильда". Этот оператор вкладывает их 0s и 1s числа. В этом случае числа 0 и Вашего представления в бинарном 000000000. Применив бинарное отрицание бинарного вытекающего числа 11111111.

Бинарный номер 11111111 представляет в номер-1 в десятичном ввиду того, что используется представление "я дополняю 2". Чтобы изучать больше на дополнении 2 ты можешь читать ввод wikipedia

5
ответ дан 24.11.2019, 13:50

Сначала мы можем начинать тем, что проверяем, о чем относится друг к другу каждая из операций:

  • Я дополняю 1

    Дополнение в 1 из бинарного числа получается меняясь 01 и 10. А именно, меняется каждый бит из-за Вашего дополнения. Например (используя один byte):

      0 0 0 0 0 0 1 0    Original        ( =  2 )
      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
      1 1 1 1 1 1 0 1    Complemento a 1 ( = -3 )
    

    Veáse в Wikipedia Дополнение в один.

  • Я дополняю 2

    Дополнение в 2 из бинарного числа получается беря дополнение в 1 из числа и потом складывая 1 в наименее значительный бит (LSB или Леаст Сигнификант Бит). Беря предыдущий пример:

      0 0 0 0 0 0 1 0    Original        ( =  2 )
      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
      1 1 1 1 1 1 0 1    Complemento a 1 ( = -3 )
    +               1
      ───────────────
      1 1 1 1 1 1 1 0    Complemento a 2 ( = -2 )
    

    Дополнения в 2 из 0 0 (000000001111111100000000) и дополнение в 2 из самого отрицательного числа, Byte.MIN_VALUE, это тот же самый (100000000111111110000000).

    Veáse в Wikipedia Дополнение в два.

Сейчас, анализируя код:

  • c = -a; // resultado c = -2

    Если a = 2 (позитив), тогда c = -a он вычисляется:

    0000 0000 0000 0000 0000 0000 0000 0010    Original         ( =  2 )
    1111 1111 1111 1111 1111 1111 1111 1101    Complemento a 1  ( = -3 )
    1111 1111 1111 1111 1111 1111 1111 1110    Sumando 1 al LSB ( = -2 )
    

    Или дополнение в 2.

    Veáse §15.15.4 внутри The Java Лангвахе Спесификатион.

  • c = ~b; // resultado c = -1

    Если b = 0 (позитив), тогда c = ~b он вычисляется:

    0000 0000 0000 0000 0000 0000 0000 0000    Original         ( =  0 )
    1111 1111 1111 1111 1111 1111 1111 1111    Complemento a 1  ( = -1 )
    

    Veáse §15.15.5 внутри The Java Лангвахе Спесификатион.

5
ответ дан 24.11.2019, 13:50