位运算与SQL实现

栏目: 数据库 · 发布时间: 5年前

内容简介:程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。下面是维基百科对于位运算的简要解释:在数字技术算计编程中,一个位运算操作的是一个或多个位组合或者是二进制数字,并且这些操作都是在单个位级别上的。

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

下面是维基百科对于位运算的简要解释:

In digital computer programming, a bitwise operation operates on one or more bit patterns or binary numerals at the level of their individual bits. It is a fast, simple action directly supported by the processor, and is used to manipulate values for comparisons and calculations. On simple low-cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition. While modern processors usually perform addition and multiplication just as fast as bitwise operations due to their longer instruction pipelines and other architectural design choices, bitwise operations do commonly use less power because of the reduced use of resources.

位运算与 <a href='https://www.codercto.com/topics/18630.html'>SQL</a> 实现

在数字技术算计编程中,一个位运算操作的是一个或多个位组合或者是二进制数字,并且这些操作都是在单个位级别上的。

位运算是直接运行在处理器上的,因此非常简单而快速,常常用于比较或计算数据。

在简易的低成本处理器上,位运算是比除法快很多的,有些情况甚至比乘法和加法还要快。

但是在现代处理器上,由于其更长的指令流水线和其他结构化设计的选择,因此加法和乘法运算可以和位运算一样快,但因为更节省资源,位运算通常更加低能耗。

位运算的逻辑运算符

  1. & 与运算

位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。

对于负数,按其补码进行运算。

  1. | 或运算

位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。

逻辑运算符||与位或运算符|的区别是: 条件“或”运算符 (||) 执行 bool 操作数的逻辑“或”运算,但仅在必要时才计算第二个操作数。

x || y , x | y 不同的是,如果 x 为 true,则不计算 y(因为不论 y 为何值,“或”操作的结果都为 true)。这被称作为“短路”计算。

  1. ^ 位异或

位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。

  1. ~ 位非

位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。

应用实例

例如,有一家公司,该公司有a、b、c 三位主管(级别依次由高到低),对于公司出售的产品,主管可以提供报价,但不是每位主管都必须提供报价,因此共有a,b,c,ab,ac,bc,abc七种情况。 要求记录每位提供某个产品的报价的主管,且最终有效的报价为其中级别最高的。

现在设计price表,其中字段ap、 bp 、cp,分别表示每位主管提供的报价;字段p表示所有提供了报价的主管,其中a为1、b为2、c为4,p字段存储的是这三个数的和。

举例来说,主管b提供了报价100,主管c提供了报价93,那么ap=null,bp=100,cp=93,p=6(即2+4),其中有效的报价为b的报价100。

判断是否包含某个主管的报价,可以使用与运算:

1 转换为二进制为 0001 2 转换为二进制为 0010 4 转换为二进制为 0100

当p为6时: 6 转换为二进制为 0110

6 & 1,即0110&0001=0000=0,表示不包含主管a的报价。

6 & 2,即0110&0010=0010>0,表示包含主管b的报价。

根据是否大于0,可以判断是否包含某个主管的报价;

下面分别是建表、插入数据和使用位运算查询的SQL。

CREATE TABLE price
(
 id INT PRIMARY KEY,
 ap INT DEFAULT NULL,
 bp INT DEFAULT NULL,
 cp INT DEFAULT NULL,
 p INT DEFAULT NULL
);

INSERT INTO price VALUES
(1,NULL,100,93,6),
(2,188,170,203,7),
(3,NULL,14,NULL,2);

INSERT INTO price VALUES
(4,NULL,NULL,NULL,NULL),
(5,44,55,66,7),
(6,NULL,NULL,430,4);


SELECT
id '产品编号',
CASE WHEN p≈>0 THEN ap
     WHEN p&bp>0 THEN bp
     WHEN p&cp>0 THEN cp
     ELSE '该产品无有效报价'
     END '有效报价',
CASE WHEN p≈>0 THEN 'ap'
     WHEN p&bp>0 THEN 'bp'
     WHEN p&cp>0 THEN 'cp'
     ELSE '无'
     END '报价主管'
FROM price;

复制代码
位运算与SQL实现
位运算与SQL实现

—— 福利·贝热尔的吧台 马奈(晚年代表作)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Egret——HTML5游戏开发指南

Egret——HTML5游戏开发指南

张鑫磊 等 / 电子工业出版社 / 2016-3 / 85

《Egret——HTML5游戏开发指南》由浅入深,在讲解游戏开发基础的同时提供众多实战案例供读者学习。《Egret——HTML5游戏开发指南》章节内容包含Egret基础概念及基础图形图像处理方法、网络相关操作、移动设备适配、性能优化、文本动画相关知识、调试技巧、DragonBones骨骼动画系统和P2物理引擎等。通过《Egret——HTML5游戏开发指南》,读者可以了解并掌握HTML5游戏开发技能......一起来看看 《Egret——HTML5游戏开发指南》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具