Побитовый оператор ~ дает неожиданный результат

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

class bit
{

public static void main(String[] args)
{


int j=10;

System.out.println("jjjj"+~j);

}

}

Выдает на выходе:

-11. Ожидаемый результат должен быть -9. В чем проблема?


person user2824612    schedule 29.09.2013    source источник
comment
Почему вы ожидали -9? Результат только такой, как ожидалось.   -  person Rohit Jain    schedule 29.09.2013
comment
Согласно побитовой java, он должен давать значение меньше фактического значения.   -  person user2824612    schedule 29.09.2013


Ответы (2)


0000 1010 // = 10 i.e binary representation of 10
1111 0101 // = ~10 i.e inversion of bits

Отрицательные числа хранятся в виде дополнения до 2. Подробности см. здесь

0000 1011 // = 11 i.e binary 11
1111 0100 // inversion of bits
1111 0101 // 2's complement of 11 = -11

Таким образом,

~10 = -11

person TheKojuEffect    schedule 29.09.2013

Если мы посмотрим на двоичное число 10, мы увидим

0000 0000 0000 0000 0000 0000 0000 1010

Где первый 0 - это бит подписи.

Если теперь перевернуть двоичный файл ВКЛЮЧАЯ бит подписи, мы получим:

1111 1111 1111 1111 1111 1111 1111 0101

Что ... если вы считаете, что java использует целые числа со знаком, это -11.

Если мы на секунду отойдем от чисел со знаком и просто рассмотрим значение 4-байтового беззнакового целого числа, равное ~ 10, мы получим значение: 4294967285.

Чтобы преобразовать целое число без знака в целое число со знаком с дополнением до двух, мы вычитаем значение 2 ^ 32 из целого числа если оно больше 2 ^ 31-1.

2^32 - 4294967285 = -11

person initramfs    schedule 29.09.2013