位運算的簡介與實例(Mysql)


什麼是位運算?

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

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

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.

在數字技術算計編程中,一個位運算操作的是一個或多個位組合或者是二進制數字,並且這些操作都是在單個位級別上的。
位運算是直接運行在處理器上的,因此非常簡單而快速,常常用於比較或計算數據。
在簡易的低成本處理器上,位運算是比除法快很多的,有些情況甚至比乘法和加法還要快。
但是在現代處理器上,由於其更長的指令流水線和其他結構化設計的選擇,因此加法和乘法運算可以和位運算一樣快,但因爲更節省資源,位運算通常更加低能耗,

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


位運算的邏輯運算符

  1. & 與運算

位與運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯與運算。
對於負數,按其補碼進行運算。
2. | 或運算
位或運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯或運算。
邏輯運算符||與位或運算符|的區別
條件“或”運算符 (||) 執行 bool 操作數的邏輯“或”運算,但僅在必要時才計算第二個操作數。
x || y , x | y 不同的是,如果 x 爲 true,則不計算 y(因爲不論 y 爲何值,“或”操作的結果都爲 true)。這被稱作爲“短路”計算。
3. ^ 位異或
位異或運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯異或運算。只有當對應位的二進制數互斥的時候,對應位的結果才爲真。
4.~ 位非
位非運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯非運算。


應用實例

例如,有一家公司,該公司有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

6 & 2

0110
&
0010
=0010>0

根據是否大於0,可以判斷是否包含某個主管的報價;

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;

查詢結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章