什麼是位運算?
程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。
下面是維基百科對於位運算的簡要解釋:
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.
在數字技術算計程式設計中,一個位運算操作的是一個或多個位組合或者是二進位制數字,並且這些操作都是在單個位級別上的。
位運算是直接執行在處理器上的,因此非常簡單而快速,常常用於比較或計算資料。
在簡易的低成本處理器上,位運算是比除法快很多的,有些情況甚至比乘法和加法還要快。
但是在現代處理器上,由於其更長的指令流水線和其他結構化設計的選擇,因此加法和乘法運算可以和位運算一樣快,但因為更節省資源,位運算通常更加低能耗。
位運算的邏輯運算子
- & 與運算
位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。
對於負數,按其補碼進行運算。
- | 或運算
位或運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯或運算。
邏輯運算子||與位或運算子|的區別是: 條件“或”運算子 (||) 執行 bool 運算元的邏輯“或”運算,但僅在必要時才計算第二個運算元。
x || y , x | y 不同的是,如果 x 為 true,則不計算 y(因為不論 y 為何值,“或”操作的結果都為 true)。這被稱作為“短路”計算。
- ^ 位異或
位異或運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯異或運算。只有當對應位的二進位制數互斥的時候,對應位的結果才為真。
- ~ 位非
位非運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯非運算。
應用例項
例如,有一家公司,該公司有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&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;
複製程式碼
—— 福利·貝熱爾的吧檯 馬奈(晚年代表作)