2015-10-01 3 views
3

Я читал, что выполнение & 0x7fffffff маскирует только бит знака и не сжимает другие биты.Побитовый и (&) оператор

int a = Integer.MIN_VALUE; 
System.out.println(a & 0x7fffffff); 

Но этот код выводит

0 

вместо

2147483648 

Почему это?

+0

печать' a' после 'SOP' заявление. – Rustam

+1

Маскировка знакового бита не означает, что вы получите '-a' ... – Codebender

+0

Он печатает '-2147483648' – user3824413

ответ

1

Удаление значащий бит гарантирует, что вы получите неотрицательное значение. Это не гарантирует, что результат положительный. (0 также неотрицательно.) Также он не гарантирует, что вы получите абсолютное значение отрицательного значения. (Который вы никогда не получите.)

На самом деле это приведет к следующему значению для любого отрицательного значения int: negative_value - Integer.MIN_VALUE.

Для рассуждений, почему он ведет себя так, как это вы должны проверить, как двоичное дополнение работает: https://en.wikipedia.org/wiki/Two «s_complement

+0

Спасибо, @MatthiasWimmer за устранение моих сомнений. – user3824413

5

Отрицательные числа на Java хранятся в виде дополнения. Таким образом, значение min имеет бит знака, а все остальные не заданы. Так что вы делаете:

10000000000000000000000000000000 
& 01111111111111111111111111111111 

Когда вы очищаете знаковый бит вы получите ноль.

00000000000000000000000000000000 

Источник: https://en.wikipedia.org/wiki/Two%27s_complement

+0

@krzyk 'int a = -25; System.out.println (a & 0x7fffffff); 'prints' 2147483623'. Не следует ли напечатать '25'? – user3824413

+0

@ user3824413 Нет, он не должен видеть мой ответ на вопрос. –

Смежные вопросы