oracle位运算、左移右移、标签算法等

news2025/1/11 3:55:10

文章目录

    • 位运算基础
      • 同或
        • 同或应用场景
      • 异或
        • 异或应用场景
      • 什么是真值表
    • oracle基础函数创建
        • bitor(按位或)函数
        • bitnot(按位非)函数
        • bitxor(按位异或)函数
        • 左移函数
        • BITSHIFT()函数(实测不可用,废弃掉该方案)
        • 右移函数(略,有此场景吗?)
    • 实际应用
      • 资质字典
      • 增删改查分别对应什么操作
        • 新增对应操作
        • 查询对应的操作
        • 修改
        • 删除(正向删除)(实际不用这个,而是直接update已修改的值)
        • 删除(直接用已修改好的值)
        • 统计
        • 位运算业务层的入参有几个
        • 删除的时候是给后台已算完的值,还是到后台自己算呢?
        • 查询条件是单个值还是多个值
        • 界面展示呢?
        • 编辑界面呢?
        • 十进制转二进制字符串

项目中有标签的场景,如一个人有多个角色,多个爱好,用关联表的方式不太优雅,用左移右移相对好一点。

位运算是个基础课题,也是个大课题,它的应用非常广泛,虽然有点绕,但是必须掌握。

位运算基础

与: 有0为0。

或: 有1为1。

非:0变1、1变0。

同或

同或:相同为1,不同为0。
同或真值表:

输入a输入b输出
001
010
100
111
同或应用场景

异或

异或:不同为1,相同为0。

异或真值表:

输入a输入b输出
000
011
101
110
异或应用场景

这篇文章不错:
https://www.cnblogs.com/codelogs/p/16676272.html

什么是真值表

一直在用,但是没有十分清楚,稀里糊涂算怎么回事。
真值表用于描述逻辑门的行为,即输入与输出的关系。

oracle基础函数创建

首先oracle是不支持左移右移运算的。
select 1<<2 from dual; # 报错
select 4>>2 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 a+b-bitand(a,b);
end;
/ -- sql脚本窗口这个可以不执行。
bitnot(按位非)函数
create or replace function bitnot(a in int,b in int)
return int
is
begin
return (a+b)-bitand(a,b)*2;
end;
/ -- sql脚本窗口这个可以不执行。
bitxor(按位异或)函数
create or replace function bitxor(a in int ,b in int)
return int
is
begin
     return a+b-2*bitand(a,b);
end;
/ -- sql脚本窗口这个可以不执行。
左移函数

因为BITSHIFT()函数实测不可用,所以自己写个吧。

CREATE OR REPLACE FUNCTION left_shift (
    num IN NUMBER,
    bits IN NUMBER
) RETURN NUMBER IS
BEGIN
    RETURN 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 1<<0 | 1<<4 FROM dual; # 伪语句
SELECT bitor(left_shift(1,0) ,left_shift(1,4)  ) FROM dual; # 17
查询对应的操作

注:这里oracle select不支持boolean值,这个要特别注意,见oracle笔记。

SELECT
      CASE bitand(QUALIFICATION,1)
          WHEN 0 THEN 0
          ELSE bitand(QUALIFICATION,1)
      END as 监理,
      CASE bitand(QUALIFICATION,2)
          WHEN 0 THEN 0
          ELSE bitand(QUALIFICATION,2)
      END as 安全员,
      CASE bitand(QUALIFICATION,4)
          WHEN 0 THEN 0
          ELSE bitand(QUALIFICATION,4)
      END as 项目经理
FROM EMP;

效果如图:
在这里插入图片描述

这是mysql的写法(这里永不到也先保留吧)。

select ,
(attrbute & (1<<0) !=0) as 监理,
(attrbute & (1<<1) !=0) as 安全员,
(attrbute & (1<<2) !=0) as 项目经理,
(attrbute & (1<<3) !=0) as 技术员,
(attrbute & (1<<4) !=0) as 特种作业人员,
(attrbute & (1<<5) !=0) as 劳务人员
from emp
修改

例如要增加安全员。

oracle写法:
update emp set  qualification = bitor(qualification,left_shift(1,1))  where  id  = 1;

mysql语法:
update emp set  qualification = qualification | (1<<2) 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 IS
    v_binary VARCHAR2(4000);
    v_remainder NUMBER := p_number;
BEGIN
    WHILE v_remainder > 0 LOOP
        v_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享&#xff08;P2P&#xff09;。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据&#xff0c;关…

《零基础Go语言算法实战》【题目 1-18】切片的反转

《零基础Go语言算法实战》 【题目 1-18】切片的反转 请编写一个名为 reverse 的函数&#xff0c;采用整数切片并在不使用临时切片的情况下将切片反转。 【解答】 可以通过 for 循环交换切片中每个元素的值&#xff0c;使其从左向右滑动。最终&#xff0c;所有元素都将 被反转。…

Elasticsearch:搜索相关性

这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost&#xff1a;在索引层面修改相关性2、boosting&#xff1a;修改文档相关性3、negative_boost&#xff1a;降低相关性4、function_score&#xff1a;自定义评分5、…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业&#xff0c;再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText&#xff0c;该数据集大概40GB&#xff0c;由OpenAI创建&#xff0c;主要内…

【C++习题】22.随机链表的复制

文章目录 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09;代码&#xff1a; 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&…

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中&#xff0c;我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中&#xff0c;在 Excel 文件中添加图像&#xff08;JPEG、PNG&#xff09;,我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg &#xff0c;我们将尝试…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码&#xff1a;PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 &#xff08;环境为&#xff1a;本地局域网 无外网情况 &#xff09; …

Python 爬虫验证码识别

在我们进行爬虫的过程中&#xff0c;经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢&#xff1f;这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理&#xff08;边缘保留滤波、灰度化、二值化、…

【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.7.1. 深入理解生命周期 1.指定生命周期参数的方式依赖于函数所做的事情 以上一篇文章的代码为例子&#xff1a; fn longest<a&g…

创建并配置华为云虚拟私有云

目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式&#xff0c;它将云服务部署在企业或组织内部的私有基础设施上&#xff0c;仅供该企业或组织内部使用&#xff0c;不对外提供服务.私有云的主要特点包括&#xff1a; 私密性&#xff1a;私有云的资源&#xff08;如…

子父组件传值

Angular 2 及以上版本中的父子组件通信方式 在 Angular 2 及以上版本中&#xff0c;父子组件通信主要通过以下几种方式实现&#xff1a; 一、使用Input()进行父向子通信 父组件通过属性绑定的方式将数据传递给子组件&#xff0c;子组件使用Input()装饰器来接收这些数据。 二…

wireshark排除私接小路由

1.wireshark打开&#xff0c;发现了可疑地址&#xff0c;合法的地址段DHCP是192.168.100.0段的&#xff0c;打开后查看发现可疑地址段&#xff0c;分别是&#xff0c;192.168.0.1 192.168.1.174 192.168.1.1。查找到它对应的MAC地址。 ip.src192.168.1.1 2.通过show fdb p…

机器学习实战——决策树:从原理到应用的深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 决策树&#xff08;Decision Tree&#xff09;是一种简单而直观的分类与回归模型&#xff0c;在机器学习中广泛应用。它的…

2025年01月09日Github流行趋势

1. 项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;22750今日star数&#xff1a;1272项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, eltociear项目简介&#xff1a;你…

用python实现烟花代码,完整代码拿走不谢

有时候用python实现一些有趣的代码&#xff0c;既有趣&#xff0c;又能提升知识 使用Python实现动态烟花代码 效果如下&#xff1a; 不废话&#xff0c;直接上代码&#xff1a; import pygame from random import randint, uniform, choice import mathvector pygame.math…

Python机器学习笔记(十八、交互特征与多项式特征)

添加原始数据的交互特征&#xff08;interaction feature&#xff09;和多项式特征&#xff08;polynomial feature&#xff09;可以丰富特征表示&#xff0c;特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。 上一次学习&#xff1a;线性模型对w…