Сомнения с операторами Java - PullRequest
3 голосов
/ 04 января 2012

Я искал некоторый код некоторых классов GWT, и, к сожалению, я не смог понять эту часть кода:

private void toggleHover() {
    // Toggle hovering.
    int newFaceID = getCurrentFace().getFaceID() ^ HOVERING_ATTRIBUTE;

    // Remove disabled.
    newFaceID &= ~DISABLED_ATTRIBUTE;
    setCurrentFace(newFaceID);
  }

Я не очень хорошо знаю java-операторы, поэтому мой вопросэто:

Что именно происходит в:

a) getCurrentFace().getFaceID() ^ HOVERING_ATTRIBUTE

b) newFaceID &= ~DISABLED_ATTRIBUTE;

& является побитовым AND и^ - побитовый исключающий оператор ИЛИ.Это все, что я знал об этом.Но я не понимаю ~DISABLED_ATTRIBUTE и что происходит в значениях значений.

Этот фрагмент кода из класса GWT com.google.gwt.user.client.ui.CustomButton.

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

Ответы [ 5 ]

3 голосов
/ 04 января 2012

Строка с ^ переключает бит, обозначающий HOVERING_ATTRIBUTE. Если бит был 1, он равен 0; если бит был равен 0, он равен 1.

Строка с &= ~ очищает бит, который обозначает DISABLED_ATTRIBUTE. Независимо от того, какое значение было до этого, бит теперь будет 0.

Одна вещь ~ инвертирует все биты DISABLED_ATTRIBUTE, поэтому в результате получается то, что мы называем битовой маской, подходящей для ANDing: бит, за которым стоит DISABLED_ATTRIBUTE, становится 0, а все остальные биты становятся 1 Таким образом, если вы И какое-либо значение с этой маской, в результате этот бит будет очищен, а все остальные биты останутся неизменными.

2 голосов
/ 05 января 2012

В идентификаторе должен быть бит, зарезервированный для состояния наведения. Выражение getCurrentFace().getFaceID() ^ HOVERING_ATTRIBUTE выглядит как , переключающее атрибут зависания текущей грани. Другими словами, если бит HOVERING_ATTRIBUTE равен единице, он устанавливается в ноль; если он равен нулю, он равен единице.

Еще один бит должен быть отключенным статусом. Выражение newFaceID &= ~DISABLED_ATTRIBUTE очищает этот бит. То есть бит DISABLED_ATTRIBUTE устанавливается в ноль.

1 голос
/ 05 января 2012

Это старый добрый С-стиль. Целое число FaceID хранит набор битов, которые представляют выбранные логические атрибуты.

например. HOVERING_ATTRIBUTE равно 2, DISABLED_ATTRIBUTE равно 4.

Путем выполнения побитового xor (^) и побитового not (~) можно установить или сбросить эти два бита, оставив другие биты без изменений.

1 голос
/ 05 января 2012

~ поразрядно NOT.

Будет инвертировать каждый бит DISABLED_ATTRIBUTE.

1 голос
/ 04 января 2012

~ - это побитовый оператор NOT в Java.

В общем, операция в b) заключается в том, что он принимает NOT из DISABLED_ATTRIBUTE, И получает его с newFaceID, и назначаетnewFaceID (это операция маскирования).

...