Подтвердить что ты не робот

Обновление определенного бита в целочисленном столбце

У меня есть таблица mysql, где пользовательские разрешения хранятся в виде битовой маски:

|user   | permissions |
| Admin | 31          |
| User  | 13          |

           16 8  4  2  1
Admin ->   1  1  1  1  1  -> 16 + 8 + 4 + 2 + 1 -> 31
User  ->   0  1  1  0  1  ->  8 + 4 + 1 -> 13

Теперь я хочу добавить разрешение для каждого пользователя с запросом sql. Скажем, я хочу добавить разрешение 16 для всех без изменения другого бита.

 UPDATE users SET permission = ????

Как это сделать?

4b9b3361

Ответ 1

Чтобы добавить разрешение 16, вы просто скажете

UPDATE users SET permission = permission | 16;

Побитовый оператор OR включит бит. Чтобы отключить их, используйте операцию И с дополнением к бит, который вы хотите отключить:

UPDATE users SET permission = permission & ~16

Ответ 2

Вы должны заглянуть в MySQL SET. Это может сделать вашу жизнь намного легче. Вместо этой фанковой бинарной логики вы можете просто создать набор и позволить MySQL выполнять двоичную логику для вас. Это ограничит количество возможных ошибок программиста, проблемы отладки и сделает ваш код более читаемым.

Но если вы настроены на использование целого числа, загляните в Функции бит. Например, чтобы узнать, установлено ли разрешение 16:

SELECT permission<<4 & 1 FROM users

И если вы хотите добавить разрешение:

UPDATE users SET permission = permission | 16

Ответ 3

Как более общее решение, чем предлагаемые до сих пор (если вы хотите использовать int для хранения):

Если вы хотите изменить бит в позиции x (справа) со значением TARGET:

разрешение = разрешение + (TARGET - ((разрешение → x)% 2)) < х