Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как работать с BITAND  [new]
Ora_beginer
Guest
Доброго времени суток.
У меня вопрос по кодированию.
Есть 5 флажков (1, 2, 3, 4, 5). Нужно закодировать отмеченные (0/1) одним числом.
Решил использовать BITAND, но что-то немного не понятно как она работает.
Допустим, отмечены 2-й и 4-й, т.е. если бы я кодировал текстовой строкой, это было бы так: '01010'
закодированное число: 2^0 + 2^1 + 2^0 + 2^3 + 2^0 = 2 + 8 = 10
А вот как мне обратно из этого числа узнать, какие флажки были взведены?
Или я не так делаю?
Заранее благодарен за помощь.
15 авг 11, 12:10    [11119010]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
Ora_beginer,
bin_to_num
15 авг 11, 12:17    [11119063]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Ora_beginer
Доброго времени суток.
У меня вопрос по кодированию.
Есть 5 флажков (1, 2, 3, 4, 5). Нужно закодировать отмеченные (0/1) одним числом.
Решил использовать BITAND, но что-то немного не понятно как она работает.
Допустим, отмечены 2-й и 4-й, т.е. если бы я кодировал текстовой строкой, это было бы так: '01010'
закодированное число: 2^0 + 2^1 + 2^0 + 2^3 + 2^0 = 2 + 8 = 10
А вот как мне обратно из этого числа узнать, какие флажки были взведены?
Или я не так делаю?
Заранее благодарен за помощь.

select
   rownum r
  ,bitand(rownum, 1) B1
  ,bitand(rownum, 2) B2
  ,bitand(rownum, 4) B4
  ,bitand(rownum, 8) B8
  ,bitand(rownum,16) B16
from dual connect by level < 17;
15 авг 11, 12:24    [11119124]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
dba123
Member

Откуда:
Сообщений: 1054
Ora_beginer,

var d number
exec :d := 127;
select 
 nvl(decode(bitand(32,:d),32,1),0) "2^5",
 nvl(decode(bitand(16,:d),16,1),0) "2^4",
 nvl(decode(bitand(8,:d),8,1),0) "2^3",
 nvl(decode(bitand(4,:d),4,1),0) "2^2",
 nvl(decode(bitand(2,:d),2,1),0) "2^1",
 nvl(decode(bitand(1,:d),1,1),0) "2^0",
 :d "dec"
  FROM dual;
15 авг 11, 12:25    [11119136]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
AmKad
Member

Откуда:
Сообщений: 5222
with s as (select bin_to_num(1, 1, 0, 0, 1, 0, 1, 0) num from dual)
select num, 
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 8) b8,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 7) b7,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 6) b6,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 5) b5,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 4) b4,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 3) b3,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 2) b2,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 1) b1
from s;

       NUM         B8         B7         B6         B5         B4         B3         B2         B1
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
       202          1          1          0          0          1          0          1          0
1 row selected.
15 авг 11, 12:29    [11119168]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
dba123
Ora_beginer,

var d number
exec :d := 127;
select 
 nvl(decode(bitand(32,:d),32,1),0) "2^5",
 nvl(decode(bitand(16,:d),16,1),0) "2^4",
 nvl(decode(bitand(8,:d),8,1),0) "2^3",
 nvl(decode(bitand(4,:d),4,1),0) "2^2",
 nvl(decode(bitand(2,:d),2,1),0) "2^1",
 nvl(decode(bitand(1,:d),1,1),0) "2^0",
 :d "dec"
  FROM dual;


sign()
15 авг 11, 12:33    [11119213]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
dba123
Member

Откуда:
Сообщений: 1054
orawish,
да, спасибо
15 авг 11, 12:38    [11119249]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
Ora_beginer
Guest
orawish
select
rownum r
,bitand(rownum, 1) B1
,bitand(rownum, 2) B2
,bitand(rownum, 4) B4
,bitand(rownum, 8) B8
,bitand(rownum,16) B16
from dual connect by level < 17;

Спасибо! Очень помогло!
15 авг 11, 12:47    [11119330]     Ответить | Цитировать Сообщить модератору
 Re: Как работать с BITAND  [new]
AmKad
Member

Откуда:
Сообщений: 5222
AmKad
with s as (select bin_to_num(1, 1, 0, 0, 1, 0, 1, 0) num from dual)
select num, 
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 8) b8,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 7) b7,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 6) b6,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 5) b5,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 4) b4,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 3) b3,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 2) b2,
dbms_utility.is_bit_set(utl_raw.cast_from_binary_integer(num), 1) b1
from s;

       NUM         B8         B7         B6         B5         B4         B3         B2         B1
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
       202          1          1          0          0          1          0          1          0
1 row selected.

Без PL/SQL
with s as 
(select bin_to_num(1, 1, 0, 0, 1, 0, 1, 0) num from dual union all
 select bin_to_num(1, 0, 1, 1, 1, 0, 1, 0) num from dual
)
select num, 
sign(bitand(num, power(2, 7))) b8,
sign(bitand(num, power(2, 6))) b7,
sign(bitand(num, power(2, 5))) b6,
sign(bitand(num, power(2, 4))) b5,
sign(bitand(num, power(2, 3))) b4,
sign(bitand(num, power(2, 2))) b3,
sign(bitand(num, power(2, 1))) b2,
sign(bitand(num, power(2, 0))) b1
from s;

       NUM         B8         B7         B6         B5         B4         B3         B2         B1
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
       202          1          1          0          0          1          0          1          0
       186          1          0          1          1          1          0          1          0

2 rows selected.
15 авг 11, 12:53    [11119379]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить