დღეს ზედმეტი მოვინდომე და ბაზაში მონაცემების ბიტმასკების სახით შენახვა გადავწყვიტე, რომელიც მერე ისევ თვითონ ბაზას უნდა დაემუშავებინა. შემდეგ ვნახე, რომ ორაკლში არ არის რეალიზებული ბიტური ოპერაციები და არის მხოლოდ ერთი – bitand() ფუნქცია, რომელიც ბიტურ “and”-ს აკეთებს რიცხვებზე.
“or” და “xor”-ის მიღებაც ამ ფუნქციის გამოყენებით მარტივად შეიძლება. მაგალითად a და b რიცხვებზე “or” ოპერაცია გამოვა
a + b - bitand(a,b)
ხოლო “xor”-ს მივიღებთ თუ კიდევ ერთხელ გამოვაკლებთ:
a + b - bitand(a,b) - bitand(a,b)
არც ბიტური წაძვრები (shift >>) აქვს, მაგრამ მაგის ჩანაცვლება 2-ზე გამრავლებით და გაყოფით შეიძლება.
MySQL-ში არ დამჭირვებია, მაგრამ ეხლა შევხედე და ჰქონია პირდაპირ &, |, ~, ^, <<, >> და თან bit_count() ფუნქციაც, რომელიც ჩართულ ბიტების რაოდენობას აბრუნებს. მათი გამოყენება პირდაპირ sql ქვერებშიც შეიძლება.
ბოლოს დამაინტერესა და სხვა ბაზებსაც გადავწვდი. PostgreSQL-ში უკანასკნელის მსგავსად ყველა არის რეალიზებული, MS SQL-ში კი მხოლოდ and, or და xor არიან.
პრინციპში დიდი გამოყენება ალბათ არ აქვთ, მაგრამ ზოგ შემთხვევაში ძალიან მოსახერხებელი გამოდის. მაგალითად, თუ ობიექტთან დაკავშირებული სტატიკური (თუნდაც არასტატიკური) პატარა სიმრავლის შენახვაა საჭირო, ანუ ამ ობიექტისთვის სიმრავლეში რომელი ელემენტებია ”ჩართული” და რომელი არა.
ყველგან 2-ის ხარისხებზე გაყოფა ხორციელდება წაძვრებით და აქ პირიქით მოგიწია? =)
ვაჰ =) ეგ შენი პირველი კომენტარია მგონი =)
ეგრე გამოვიდა. მაგრამ მე ბევრი გამრავლება არ დამჭირვებია 🙂 კვირის დღეების სიმრავლე მქონდა
http://www.jlcomp.demon.co.uk/faq/bitwise.html
ნახე ეს ლინკი, შეიძლება გამოგადგება 🙂 ისე მეც გამიკვირდა, რომ ნორმალურად არა აქვს Oracle-ს ეს ფუნქციონალი გაკეთებული.
@Czar
მადლობა 🙂
ეს raw-ს გამოყენება ვნახე მაგრამ კიდევ კარგი ასეთი დიდი ფუნქციონალი არ მჭირდებოდა და bitand მეყო, თორემ მაგ პაკეტში ტესტირება და დებაგირება რა საშინელებაა ხომ წარმოგიდგენია 🙁