位運算與SQL實現

什麼是位運算?

程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算就是直接對整數在內存中的二進制位進行操做。git

下面是維基百科對於位運算的簡要解釋:編程

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. bash

維基百科對於位運算的介紹

在數字技術算計編程中,一個位運算操做的是一個或多個位組合或者是二進制數字,而且這些操做都是在單個位級別上的。less

位運算是直接運行在處理器上的,所以很是簡單而快速,經常用於比較或計算數據。spa

在簡易的低成本處理器上,位運算是比除法快不少的,有些狀況甚至比乘法和加法還要快。設計

可是在現代處理器上,因爲其更長的指令流水線和其餘結構化設計的選擇,所以加法和乘法運算能夠和位運算同樣快,但由於更節省資源,位運算一般更加低能耗。3d

位運算的邏輯運算符

  1. & 與運算

位與運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯與運算。code

對於負數,按其補碼進行運算。orm

  1. | 或運算

位或運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯或運算。cdn

邏輯運算符||與位或運算符|的區別是: 條件「或」運算符 (||) 執行 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爲一、b爲二、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&ap>0 THEN ap
     WHEN p&bp>0 THEN bp
     WHEN p&cp>0 THEN cp
     ELSE '該產品無有效報價'
     END '有效報價',
CASE WHEN p&ap>0 THEN 'ap'
     WHEN p&bp>0 THEN 'bp'
     WHEN p&cp>0 THEN 'cp'
     ELSE '無'
     END '報價主管'
FROM price;

複製代碼

查詢結果

馬奈(晚年表明做)福利·貝熱爾的吧檯
—— 福利·貝熱爾的吧檯 馬奈(晚年表明做)
相關文章
相關標籤/搜索