Я читал, что выполнение & 0x7fffffff
маскирует только бит знака и не сжимает другие биты.Побитовый и (&) оператор
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
Но этот код выводит
0
вместо
2147483648
Почему это?
Я читал, что выполнение & 0x7fffffff
маскирует только бит знака и не сжимает другие биты.Побитовый и (&) оператор
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
Но этот код выводит
0
вместо
2147483648
Почему это?
Удаление значащий бит гарантирует, что вы получите неотрицательное значение. Это не гарантирует, что результат положительный. (0 также неотрицательно.) Также он не гарантирует, что вы получите абсолютное значение отрицательного значения. (Который вы никогда не получите.)
На самом деле это приведет к следующему значению для любого отрицательного значения int
: negative_value - Integer.MIN_VALUE
.
Для рассуждений, почему он ведет себя так, как это вы должны проверить, как двоичное дополнение работает: https://en.wikipedia.org/wiki/Two «s_complement
Спасибо, @MatthiasWimmer за устранение моих сомнений. – user3824413
Отрицательные числа на Java хранятся в виде дополнения. Таким образом, значение min имеет бит знака, а все остальные не заданы. Так что вы делаете:
10000000000000000000000000000000
& 01111111111111111111111111111111
Когда вы очищаете знаковый бит вы получите ноль.
00000000000000000000000000000000
@krzyk 'int a = -25; System.out.println (a & 0x7fffffff); 'prints' 2147483623'. Не следует ли напечатать '25'? – user3824413
@ user3824413 Нет, он не должен видеть мой ответ на вопрос. –
печать' a' после 'SOP' заявление. – Rustam
Маскировка знакового бита не означает, что вы получите '-a' ... – Codebender
Он печатает '-2147483648' – user3824413