Tags:

สมมติเราค่า permission ที่ set ไว้ต่างๆดังนี้
Permission
8 = Superadmin
4 = Publish
2 = Write
1 = Read

อันนี้คือตารางวิทธิของ user แต่ละคน ซึ่งฟิลด์ Settings จะเก็บค่าที่ได้จากการวก permission ต่างๆเข้าด้วยกัน
สมมติ UserID 1 ก็คือเป็น 8 + 4 + 2 + 1 ก็คือจะมี permission ทุกอย่างตามข้างบน

Settings
UserID | Settings
1 15
2 2
3 4
4 7
5 5

แล้วเขียนคำสั่ง query เพื่อดู่าใครมีสิทธิ superadmin บ้าง ดังนี้

SELCT UserID FROM Settings WHERE Settings & 8=8
Query แล้วก็จะได้ผลออกเป็น
UserID = 1

รู้สึกจะเป้นเรื่อง bitwise มีใครพออธิบายเป้นภาษาง่ายให้เข้าใจได้บ้างมั๊ยครับ เหอะๆ

ขอบคุณครับ
Quote
MultiQuote
Edit

Get latest news from Blognone
By: silverparasol
Windows
on 12 October 2012 - 21:26 #489446

มันเป็นการ or (bitwise operation) ครับ ไม่ใช่ การบวก

ต้องมองแบบนี้ครับ
ค่าของแต่ละตัวเป็น flag แล้วก็เอามา or กัน จากตัวอย่างที่ยกมานะครับ

  • superadmin = (1 << 3) = 8
  • publish = (1 << 2) = 4
  • write = (1 << 1) = 2
  • read = (1 << 0) = 1
  • permission = superadmin | publish | write | read

( << คือ right shift operation)

ถ้าหากว่ามี user ที่มีสิทธิ์ เป็น publish กับ read ก็ จะได้ ค่า permission = publish | read
ซึ่งก็จะเท่ากับ 4 | 1 หรือ ก็คือ 5 นั้นเอง

ที่นี้ เวลาจะตรวจสถานะ ก็ให้เอา ค่าของสถานที่ต้องการมาทำการ and (bitwise operation) ก็จะรู้ว่า มีสิทธิ์อะไรบ้าง ยกตัวอย่าง

ถ้าค่า permission = 9
ก็เอาค่า flag ของแต่ละตัวมา and ก็จะรู้ว่ามีสิทธิ์อะไรบ้าง

  • permission & superadmin = 9 & 8 = 8
  • permssion & publish = 9 & 4 = 0
  • permission & write = 9 & 2 = 0
  • permission & read = 9 & 1 = 1

นั่นคือ user คนนี้ มีสิทธิ์ superadmin กับ read
ถ้าคิดในอีกมุมหนึ่งคือ 9 = 8 | 1 ซึ่งก็คือ superadmin | read นั้นเอง

By: anu
Contributor
on 12 October 2012 - 21:47 #489458

ใส่วงเล็บเพื่อให้ดูง่ายขึ้น (Settings & 8) = 8

แปลง SQL เป็นคำพูดในที่นี้จะอธิบายว่า

ให้นำ Settings มาทำการ Bitwise AND (&) กับ 8 หากได้ 8 ก็ให้ดึงข้อมูลในแถวนี้มาแสดง

Bitwise คือการคำนวณในฐานสอง ก่อนอื่นต้องแปลงค่าก่อน
ค่า UserID 1 ที่ใส่ลงไปในตารางคือ 15 (เกิดจาก 8+4+2+1) เขียนเป็นฐานสองได้ว่า 1111
ค่าที่นำมาเปรียบเทียบในที่นี้คือ 8 เขียนเป็นฐานสองได้ว่า 1000

Bitwise AND หมายถึงหาก Bit เป็นหนึ่งทั้งคู่ในแถวใดให้แทนด้วย 1

  1111
& 1000
_______
  1000

เสร็จแล้วนำผลลัพภ์มาแปลงกลับ 1000 = 8 ฐานสิบ เท่ากับตัวอย่างที่ให้มา ทำให้วลีนี้ถูกต้อง มันจึงนำข้อมูลในแถวนี้มาแสดง

ลองดูข้อมูลเพิ่มเติม http://en.wikipedia.org/wiki/Bitwise_operation#AND

By: kinnykop on 15 October 2012 - 11:15 #490332
kinnykop's picture

ขอบคุณมากๆครับ

By: Avatar
AndroidUbuntuWindows
on 17 October 2012 - 18:22 #491876

ขอบคุณครับ

By: kikwan
Android
on 22 October 2012 - 11:02 #494458

ดูดๆๆ ความรู้