【问题标题】:PLSQL bitmask valuesPLSQL 位掩码值
【发布时间】:2021-05-12 14:57:09
【问题描述】:

我处于这种情况,我无法验证打印权限的位。不幸的是,我不能有一个点亮的位掩码。你能给我一些建议吗?

SELECT 
  DECODE(BITAND(00000000100000100000000000000001, 1), 1, '1', '0') AS READ,
  DECODE(BITAND(00000000100000100000000000000001, 131072), 131072, '1', '0') AS COPY,
  DECODE(BITAND(00000000100000100000000000000001, 8388608), 8388608, '1', '0') AS PRINT
  FROM 
DUAL

结果如下

R C P
- - -
1 1 0

你能给我一些建议吗?

【问题讨论】:

  • 00000000100000100000000000000001 是一个十进制数,100000100000000000000001 转换为二进制时恰好将第 1 位和第 18 位设置为 1,第 24 位设置为零。因此,如果您想使用bitand,您需要将您的“二进制”值转换为实数,正如第一个参数所期望的那样。那么......该值来自哪里,它是什么数据类型 - 一个零填充字符串?如果它是一个字符串,并且您正在寻找一个位,那么使用substr() 将其拉出会更简单。

标签: oracle bitmask


【解决方案1】:

BIT_AND 函数的两个参数都是数字,并且没有位向量。

例如:

select bin_to_num(0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1) from dual;

OUTPUT>
8519681

with 
datum as
(select bin_to_num(0,0,0,0,0,0,0,0,1/*print*/,0,0,0,0,0,1/*copy*/,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1/*read*/) val from dual)
select 
  decode(bitand(val, 1), 1, '1', '0') as read,
  decode(bitand(val, 131072), 131072, '1', '0') as copy,
  decode(bitand(val, 8388608), 8388608, '1', '0') as print
from  datum 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多