Oracle按位运算符&、|、^、~如何使用?
How to use Oracle bitwise operators &, |, ^, ~?
我需要在我的项目中使用Oracle按位运算。我知道有 BITAND() 可用于此目的。据我所知,BITAND() 是唯一的此类运算符,其他运算符(例如按位或运算符)可以从 BITAND() 派生。
我还发现Oracle还有另外一组位运算符:
AND &
OR |
XOR ^
NOT ~
我心想:为什么要从 BITAND() 派生其他运算符而不是使用这组已经可用的运算符呢?问题是,通过查找例子,发现所有的技术文档都只提供了概念,比如
15 & 9 yields 9 (1111 & 1001 = 1001)
15 | 9 yields 15 (1111 | 1001 = 1111)
15 ^ 9 yields 6 (1111 ^ 1001 = 0110)
但我没能找到这些运算符如何使用的单个示例。我自己试过:
select 15 & 9 from dual;
才发现 & 甚至不被识别为按位运算符。相反,系统提示我为 &9 变量提供一个值。
我的问题是:
可以使用 &、|、^、~ 运算符代替 BITAND() 吗?
如果是,怎么做?
如果不是,为什么?
如果 &、|、^、~ 运算符用于某些不同的目的,它们的用途是什么以及如何使用?
SQL> select BitAnd(15, 9) from dual;
BITAND(15,9)
------------
9
SQL>
Oracle 的 Bit/Binary 函数列表在这里:https://docs.oracle.com/cd/E41183_01/DR/Bit_Binary_Functions.html
据我所知,大多数 Oracle 的按位函数都在 UTL_RAW 中,它们旨在用于 RAW 数据类型。这有点麻烦,但你可以很容易地编写自己的包装函数。
declare
x1 raw(10) := utl_raw.cast_from_binary_integer(15);
x2 raw(10) := utl_raw.cast_from_binary_integer(9);
raw_result raw(10);
result number;
begin
raw_result := utl_raw.bit_and(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_and: ' || result);
raw_result := utl_raw.bit_or(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_or: ' || result);
raw_result := utl_raw.bit_xor(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_xor: ' || result);
end;
/
听起来 kfinity 的答案是可行的,但为了论证,这篇 Ask Tom 文章展示了除 bitnot 之外的所有示例。也许它可以帮助某人。
select bitand(15,9) bitand,
(15 + 9) - bitand(15,9) bitor,
(15 + 9) - BitAND(15,9) * 2 bitxor
from dual;
BITAND BITOR BITXOR
---------- ---------- ----------
9 15 6
1 row selected.
我很想知道如何做 bitnot。
我需要在我的项目中使用Oracle按位运算。我知道有 BITAND() 可用于此目的。据我所知,BITAND() 是唯一的此类运算符,其他运算符(例如按位或运算符)可以从 BITAND() 派生。
我还发现Oracle还有另外一组位运算符:
AND &
OR |
XOR ^
NOT ~
我心想:为什么要从 BITAND() 派生其他运算符而不是使用这组已经可用的运算符呢?问题是,通过查找例子,发现所有的技术文档都只提供了概念,比如
15 & 9 yields 9 (1111 & 1001 = 1001)
15 | 9 yields 15 (1111 | 1001 = 1111)
15 ^ 9 yields 6 (1111 ^ 1001 = 0110)
但我没能找到这些运算符如何使用的单个示例。我自己试过:
select 15 & 9 from dual;
才发现 & 甚至不被识别为按位运算符。相反,系统提示我为 &9 变量提供一个值。
我的问题是:
可以使用 &、|、^、~ 运算符代替 BITAND() 吗?
如果是,怎么做?
如果不是,为什么?
如果 &、|、^、~ 运算符用于某些不同的目的,它们的用途是什么以及如何使用?
SQL> select BitAnd(15, 9) from dual;
BITAND(15,9)
------------
9
SQL>
Oracle 的 Bit/Binary 函数列表在这里:https://docs.oracle.com/cd/E41183_01/DR/Bit_Binary_Functions.html
据我所知,大多数 Oracle 的按位函数都在 UTL_RAW 中,它们旨在用于 RAW 数据类型。这有点麻烦,但你可以很容易地编写自己的包装函数。
declare
x1 raw(10) := utl_raw.cast_from_binary_integer(15);
x2 raw(10) := utl_raw.cast_from_binary_integer(9);
raw_result raw(10);
result number;
begin
raw_result := utl_raw.bit_and(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_and: ' || result);
raw_result := utl_raw.bit_or(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_or: ' || result);
raw_result := utl_raw.bit_xor(x1,x2);
result := utl_raw.cast_to_binary_integer(raw_result);
dbms_output.put_line('bit_xor: ' || result);
end;
/
听起来 kfinity 的答案是可行的,但为了论证,这篇 Ask Tom 文章展示了除 bitnot 之外的所有示例。也许它可以帮助某人。
select bitand(15,9) bitand,
(15 + 9) - bitand(15,9) bitor,
(15 + 9) - BitAND(15,9) * 2 bitxor
from dual;
BITAND BITOR BITXOR
---------- ---------- ----------
9 15 6
1 row selected.
我很想知道如何做 bitnot。