Побитовые операторы Грааля - PullRequest
0 голосов
/ 04 апреля 2011

Кто-нибудь может пролить некоторый свет на мою проблему с побитовыми операторами в Grails (или, если на то пошло, отличными)?

Я пытаюсь использовать свойство класса домена с флагами, и вот что я пробовал до сих пор - ни один из них не работает:

manager.memberOf &= 0x04

manager.memberOf = manager.memberOf & 0x04

manager.memberOf = manager.memberOf.and(0x04)

есть идеи? Я совершенно невежественен ...

ТИА, Сфера

ps: manager.memberOf является целочисленным типом и имеет значение по умолчанию 0 (ноль)

ps2: memberOf остается нулевым после любой из этих операций

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Побитовый оператор & принимает два аргумента.Если какой-либо из этих аргументов равен 0, результат будет нулевым.В вашем случае результат всегда равен 0, потому что один из аргументов (начальное значение manager.memberOf) равно 0.

1 голос
/ 25 апреля 2014

Если вы хотите установить бит, вы должны использовать оператор OR (объединение).

def MANAGER = 0x04
manager.memberOf |= MANAGER

затем, когда вы хотите проверить, включен ли флаг, сначала вы должны получить только бит из байта, используя ту же маску с оператором AND (пересечение), и сравнить с маской. Если он совпадает с маской, бит был включен, если он равен 0, бит был отключен.

(manager.memberOf & MANAGER) == MANAGER

Полный рабочий пример:

def MANAGER = 1
def ADMIN = 2
def CLIENT = 4

def manager = [memberOf:0]

// Add to the MANAGER
manager.memberOf |= MANAGER


assert (manager.memberOf & MANAGER) == MANAGER
assert (manager.memberOf & ADMIN) == 0
assert (manager.memberOf & CLIENT) == 0​
...