做视频网站 视频放在哪,icp备案号什么意思,建设学院网站的通知书,怎样维护网站的安全和备份文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用#xff0c;废弃掉该方案)右移函数(略#xff0c;有此场景吗?) 实际应用资质字典… 文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用废弃掉该方案)右移函数(略有此场景吗?) 实际应用资质字典增删改查分别对应什么操作新增对应操作查询对应的操作修改删除(正向删除)(实际不用这个而是直接update已修改的值)删除(直接用已修改好的值)统计位运算业务层的入参有几个删除的时候是给后台已算完的值还是到后台自己算呢?查询条件是单个值还是多个值界面展示呢?编辑界面呢?十进制转二进制字符串 项目中有标签的场景如一个人有多个角色多个爱好用关联表的方式不太优雅用左移右移相对好一点。 位运算是个基础课题也是个大课题它的应用非常广泛虽然有点绕但是必须掌握。
位运算基础
与
与 有0为0。
或
或 有1为1。
非
非0变1、1变0。
同或
同或相同为1不同为0。 同或真值表
输入a输入b输出001010100111
同或应用场景
异或
异或不同为1相同为0。
异或真值表
输入a输入b输出000011101110
异或应用场景
这篇文章不错 https://www.cnblogs.com/codelogs/p/16676272.html
什么是真值表
一直在用但是没有十分清楚稀里糊涂算怎么回事。 真值表用于描述逻辑门的行为即输入与输出的关系。
oracle基础函数创建
首先oracle是不支持左移右移运算的。 select 12 from dual; # 报错 select 42 from dual; # 报错
自带的函数只有一个bitand。 select bitand(1,2) from dual; #支持
bitor(按位或)函数
create or replace function bitor(a in int,b in int)
return int
is
begin
return ab-bitand(a,b);
end;
/ -- sql脚本窗口这个可以不执行。bitnot(按位非)函数
create or replace function bitnot(a in int,b in int)
return int
is
begin
return (ab)-bitand(a,b)*2;
end;
/ -- sql脚本窗口这个可以不执行。bitxor(按位异或)函数
create or replace function bitxor(a in int ,b in int)
return int
is
beginreturn ab-2*bitand(a,b);
end;
/ -- sql脚本窗口这个可以不执行。左移函数
因为BITSHIFT()函数实测不可用所以自己写个吧。
CREATE OR REPLACE FUNCTION left_shift (num IN NUMBER,bits IN NUMBER
) RETURN NUMBER IS
BEGINRETURN num * POWER(2, bits);
END;
/例
SELECT left_shift(10, 2) FROM dual;BITSHIFT()函数(实测不可用废弃掉该方案)
左移示例(报错)
SELECT BITSHIFT(123, 2, BINARY_INTEGER) AS left_shifted FROM DUAL;右移示例(报错)
SELECT BITSHIFT(123, -2, BINARY_INTEGER) AS right_shifted FROM DUAL;右移函数(略有此场景吗?)
主要是没有右移的场景吧。
实际应用
资质字典
qualification int(11) NOT NULL COMMENT ‘1监理2安全员4项目经理8技术员16特种作业人员32劳务人员’, # 注是整数类型
1监理2安全员4项目经理8技术员16特种作业人员32劳务人员
增删改查分别对应什么操作
新增对应操作
例如有两种资质 1监理 4项目经理
语句
SELECT 10 | 14 FROM dual; # 伪语句
SELECT bitor(left_shift(1,0) ,left_shift(1,4) ) FROM dual; # 17查询对应的操作
注这里oracle select不支持boolean值这个要特别注意见oracle笔记。
SELECTCASE bitand(QUALIFICATION,1)WHEN 0 THEN 0ELSE bitand(QUALIFICATION,1)END as 监理,CASE bitand(QUALIFICATION,2)WHEN 0 THEN 0ELSE bitand(QUALIFICATION,2)END as 安全员,CASE bitand(QUALIFICATION,4)WHEN 0 THEN 0ELSE bitand(QUALIFICATION,4)END as 项目经理
FROM EMP;效果如图
这是mysql的写法(这里永不到也先保留吧)。
select ,
(attrbute (10) !0) as 监理,
(attrbute (11) !0) as 安全员,
(attrbute (12) !0) as 项目经理,
(attrbute (13) !0) as 技术员,
(attrbute (14) !0) as 特种作业人员,
(attrbute (15) !0) as 劳务人员
from emp修改
例如要增加安全员。
oracle写法
update emp set qualification bitor(qualification,left_shift(1,1)) where id 1;mysql语法
update emp set qualification qualification | (12) where id 1;删除(正向删除)(实际不用这个而是直接update已修改的值)
删除是非的操作但是值如果设置错了反而会增加如何避免增加呢? 删除的正确逻辑 先bitnot(31,2) # 31是全量值2是角色值 这样相当于把角色为设置为0 再bitand(19,BITnot(31,2)) # bitand角色位相当于置0了 SELECT bitand(19,BITnot(31,2)) FROM dual
例如要删除安全员。
oracle写法
update emp set qualification bitand(qualification,BITnot(31,2)) where id 1;注这里的31也需要想想如何设置值。
删除(直接用已修改好的值)
直接赋值实际上是对的。
统计
位运算业务层的入参有几个
肯定需要字典表。
只有坐标应该不够吧还需要边界字典表是在字典表定义比较好呢还是在哪里呢?
删除的时候是给后台已算完的值还是到后台自己算呢?
如果直接保存应该是已算完的值。
查询条件是单个值还是多个值
单个值 肯定可以多个值呢? 多个值应该也可以? 传参需要转换。
那么界面的入参应该是列表但是不是单选列表而是可多选列表。
界面展示呢?
也是应该拆分展示根据字典转换。
编辑界面呢?
实际上应该也是算好的。
十进制转二进制字符串 CREATE OR REPLACE FUNCTION DecimalToBinary(p_number NUMBER) RETURN VARCHAR2 ISv_binary VARCHAR2(4000);v_remainder NUMBER : p_number;
BEGINWHILE v_remainder 0 LOOPv_binary : MOD(v_remainder, 2) || v_binary;v_remainder : TRUNC(v_remainder / 2);END LOOP;RETURN v_binary;
END;使用
SELECT DecimalToBinary(19) FROM dual; # 10011