2015-12-25 2 views
0

Я пытаюсь разобраться в манипуляциях с битами, может ли кто-то предоставить базовые знания, которые могут помочь мне решить манипуляции с битами? Я столкнулся со следующим несоответствием.Бит-манипуляция в Java с использованием отрицания

System.out.println((~1)&1111); gives 1110. Treating ~1 as 0. 
System.out.println((~1)); gives -2. 
+1

Не ....... –

+0

Можете ли вы посмотреть в редактирование, я попытался запустить его на Eclipse, IDE. – Rahul

+0

Что делает 0 с чем-либо? –

ответ

3

С official tutorial по Oracle:

Унарного оператор побитового дополнения "~" инвертирует битовый шаблон; он может быть применен к любому из целочисленных типов, что делает каждый «0» «1» и каждый «1» а «0»

Причина вы получите -2 для ~1 обусловлена ​​2-complement:

0000 0000 0000 0000 0000 0000 0000 0001 

инвертировать

1111 1111 1111 1111 1111 1111 1111 1110 

Поскольку Java использует 2-дополнение, это приводит к -2.


Сломать (~ 1) & 1111 в биты:

1111 1111 1111 1111 1111 1111 1111 1110 
0000 0000 0000 0000 0000 0100 0101 0111 
___________________________________________ 
0000 0000 0000 0000 0000 0100 0101 0110 

0100 0101 0110 в базе 10 является 1110

+0

System.out.println ((~ 1) &1111); дает 1110. Лечение ~ 1 в 0. System.out.println ((~ 1));. Дает -2 Почему это? – Rahul

+0

@Rahul Я обновил свой ответ –

+0

Тогда почему: \t System.out.println ((~ 1) &1111); дают 1110 – Rahul

1

Давайте предположим на минуту, что каждое число было ровно три бита. В этом случае, если бы мы хотели использовать подписанные числа (положительные и отрицательные), мы получили бы эти значения для 3-битного twos-complement.

000 = 0, очевидно

001 = 1

010 = 2

011 = 3

100 = -4

101 = -3

110 = -2

111 = -1

Итак, если вы инвертируете 1 на ~, что истинно 001 (потому что оператор ~ инвертирует КАЖДЫЙ бит), вы получите 110, что было бы правильно, десятичное число -2.

И если вы делаете и 1110 & 1111, то вы получите, очевидно, 1110.

+0

Спасибо! Понял! – Rahul

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