2014-09-14 2 views
-2

Недавно я начал изучать Java, и теперь я освещаю часть оператора бит. Во время учебы мне было интересно, когда используются эти побитовые операторы, и я хотел бы, чтобы вы дали мне несколько примеров, если это возможно. Спасибо!Когда используется побитовый оператор?

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html –

+0

Возможный дубликат [Когда использовать побитовые операторы во время веб-разработки?] (http://stackoverflow.com/questions/261062/when-to-use-bitwise-operators-during-webdevelopment) –

+1

Можете ли вы сузить его? Когда вы googled это, какие ссылки вы появились, и какие у вас вопросы об этих ссылках? –

ответ

2

Хороший пример - побитовое исключающее ИЛИ, чтобы поменять два номера (опять же, очень популярны в интервью) - быстрая подкачка значения без какой-либо третьей переменной:

int a = 2; // a = 0010 
int b = 11; // b = 1011 
a = a^b; // a = 0010^1011 = 1001 
b = a^b; // b = 1001^1011 = 0010 (as a at the beginning) 
a = a^b; // a = 1001^0010 = 1011 (as b at the beginning) 

Вы можете найти статью об этом в wiki

+0

@JohnKugelman только что отредактировал. Вы имели в виду это объяснение? – nosmo

+0

+1 за предоставление чего-то, чего я не знал :) –

0

Есть несколько мест, хотя они не то, что вы часто будете использовать. Вы просто закончите использовать их, когда они вам понадобятся.

Хорошим примером является проверка, является ли число четным:

if (num & 1 == 0) {} 

Они также полезны в флагах, такие как наличие этого:

private static final int ENABLE_FOO = 0x0001; 
private static final int ENABLE_BAR = 0x0002; 

static int mask = (ENABLE_FOO | ENABLE_BAR); 

public static void example() { 
    if (mask & ENABLE_FOO) { //If flag set. 
     do_foo(); 
    } 
    if (mask & ENABLE_BAR) { //If flag set. 
     do_bar(); 
    } 
} 

public static void doFooOnce() { 
    if (mask & ENABLE_FOO) { //If flag set. 
     do_foo(); 
    } 
    mask &= ~ENABLE_FOO; //Bitwise and mask by the bitwise opposite of ENABLE_FOO 
} 

Там в других местах тоже. Просто знайте, что вы не будете использовать их слишком часто, но когда вы это сделаете, они будут полезны.

0

Побитовые операторы используются для манипуляции бит, то есть в случаях, когда вы хотите перейти к «gory details» структур данных, которые в конце дня являются последовательностями байтов.

Существует множество учебников, которые объясняют различные применения побитовых операторов, однако я дам вам только одно, что (ИМХО) является наиболее полезным (по крайней мере для меня).

Иногда вы хотите обрабатывать множество булевых флагов. Вы можете создать Map<String, Boolean> и (например) передать экземпляр такой карты в какой-то метод (назовем его foo()), т.е .:

Map<String, Boolean> options = new HashMap<>(); 
// fill the map 
foo(options); 

Очевидно, что мы можем использовать перечисление и EnumMap вместо строковых ключей.

В качестве альтернативы можно определить ряд констант, таких как:

общественности статической окончательный ИНТ ONE = 1; public static final int TWO = 2; public static final int THREE = 4; public static final int FOUR = 8;

и т.д. и т.п.

Теперь мы можем изменить foo() получить int параметр и назовите его следующим образом:

foo(ONE | TWO); 
foo(ONE | FOUR); 

т.д.

В некоторых случаях это обозначение является более удобным для чтения; в большинстве случаев он экономит память и дает некоторые преимущества в производительности.

Обратите внимание, что уже упомянутый EnumMap реализован с использованием этой техники, поэтому вы можете просто использовать его в большинстве случаев и пользоваться как эффективностью, так и OOD.

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