Jump to content


where (bit & 4)=4 ??

  • Please log in to reply
2 replies to this topic

#1 bibby

  • Members
  • PipPipPip
  • Advanced Member
  • 171 posts

Posted 13 July 2006 - 03:32 AM

I'm support, not dev just so that's clear.
At the workplace, there's a system of flags for users stored as a decimal integer, but represent bits.
0001 means that the first flag is raised therefore the DB stores 1 (person A)
0100 means the same for the third, and stores 4 (person B)
0111 , first three flags raised , so I get 7. (person C)
This I understand, and it's not the problem. We have 50 or so flags and it makes things pretty easy.

What I don't get is the query we use to find out who has what flag raised..
(example structure: id tinytext, bit bigint)

If persons A,B, and C were in the database with the values 1,4,7 above, and I wanted to know who among
them has the third flag raised, we query

select id from persons where (bit & 4)=4;
It returns B, C

To get the first flag,
select id from persons where (bit & 1)=1;
It returns A, C

It works like a charm,  but I can't for the life of me wrap my head around how the query statement finds what I'm looking for. Can anyone explain to me what is going on in "where(bit & 4)=4" ?

Thanks in advance

#2 effigy

  • Staff Alumni
  • Advanced Member
  • 3,600 posts
  • LocationIL

Posted 13 July 2006 - 04:47 AM

See if this helps. The & matches up all the "on" bits of both operands. Therefore "bit & 4" reads as "where the four bit in 'bit' is on."

&  100

Regexp | Unicode Article | Letter Database

#3 bibby

  • Members
  • PipPipPip
  • Advanced Member
  • 171 posts

Posted 13 July 2006 - 05:06 PM

Very cool.
It also explains why '&&' is used in most php IF statements (returns T/F).

That helped a lot. Thanks!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users