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。