Операции на битовом уровне в Java - PullRequest
6 голосов
/ 21 октября 2011

Я пытаюсь выполнить некоторые битовые операции в Java для применения масок, представления наборов и т. Д. Почему:

int one=1;
int two=2;
int andop=1&2;
System.out.println(andop);

Печатает «0», когда предполагается, что «3»:

0...001
0...010
_______
0...011

И как я могу получить такое поведение?

Заранее спасибо

Ответы [ 5 ]

11 голосов
/ 21 октября 2011

Используйте двоичный оператор 'или':

int andop = 1 | 2;

Бинарный оператор 'и' оставит наборы битов, которые находятся на обеих сторонах;в случае 1 и 2 это не биты вообще.

10 голосов
/ 21 октября 2011

Вы смешали побитовое ИЛИ и побитовое И

5 голосов
/ 21 октября 2011

Вы ищете побитовое «ИЛИ», а не «И»:

int both = one | two;

«ИЛИ» говорит: «бит n должен быть равен 1, если он равен 1 на входе x * или * это 1 на входе y »

«И» говорит: «бит n должен быть равен 1, если он равен 1 на входе x *, и * равен 1 на входе y "

2 голосов
/ 21 октября 2011

& должно быть как 1

0...001
&...&&&
0...010
_______
0...000

answer = 0
|это или, один 1 в порядке

0...001
|...|||
0...010
_______
0...011

ответ = 3

0 голосов
/ 13 апреля 2013

Лучшим решением является использование перечислений с int значениями ONE (1), TWO (2) и т. Д. И EnumSet .

Из JavaDoc:

Наборы перечислений представляются внутри как битовые векторы .Это представление чрезвычайно компактно и эффективно.Пространственно-временные характеристики этого класса должны быть достаточно хорошими, чтобы его можно было использовать в качестве высококачественной, безопасной с точки зрения типов альтернативы традиционным основанным на int «битовым флагам ».

...