1. 程式人生 > 其它 >在oracle實踐學習位運算 第一篇(r4筆記第55天)

在oracle實踐學習位運算 第一篇(r4筆記第55天)

今天無意中看到了譚浩強先生的<<c程式設計>>這本書,雖然c語言都是很多年前學過的東西了,但是看起來親切,實際用起來陌生,很多的概念都已經很模糊了,記得上大學時老師特別推薦的位運算這一部分,自己這次又看了下,還是有一定的收穫。 位運算非常的簡潔,使用起來看起來很高深,很有專業的味道,經常在一些筆試面試題中出現一些位運算的身影。而且個人覺得位運算確實是比較通用和精華的內容。 位運算是二進位制位的運算,c語言提供了位運算的功能,在其它的高階語言(java)中也有實現,還是具有一定的優勢的。 c語言中提供的位運算子有 按位與 & 按位或 | 按位異或 ^ 取反 ~ 左移 << 右移 >>

這6種運算子中,除了取反~運算子外,其它的都是二目運算子,就是要求運算子兩側各有一個運算量,運算量是整型或者字元型的資料 先來看看按位與,基本的運算規則就是 0&0=0 ,0&1=0 ,1&0=0,1&1=1 因為是二進位制的運算,我們轉換成二進位制的方式來看就比較清楚了。 以3&5為例。 00000011 00000101 & --------------- 00000001 所以3&5按位與的結果就是1, 明白了這些基本內容,我們如果通過c語言,或者java來簡單測試是沒有問題的,我手頭有oracle的環境,那就用oracle來試試。 oracle中對於按位與是通過bitand來實現的。通過字面理解也很容易區別。 SQL> select bitand(3,5) from dual; BITAND(3,5) ----------- 1
按位或 按位或的基本運算規則就是 0|0=0, 0|1=1,1|0=1,1|1=1 還是上面相似的例子3|5 00000011 00000101 | --------------- 00000111 所以按位或的結果就是7 當然了在oracle中可沒有直接的函式bitor 但是我們可以通過bitand來得到bitor的結果。 基本的公式就是bitor(x,y)=x+y-bitand(x,y) 所以bitor(3,5)=3+5-bitand(3,5)=8-1=7 按位異或 按位異或有時候也叫XOR運算子,它的運算規則是 0^0=0, 0^1=1, 1^0=1, 1^1=0 還是類似的例子。 3^5 00000011 00000101 ^ --------------- 00000110
所以按位異或的結果就是6 在oracle中也沒有按位異或的函式bitxor,但是可以通過bitand來實現。 bitxor(x,y)=bitor(x,y) - bitand(x,y) = (x + y) - BITAND(x, y) * 2 所以bitxor(3,5)=3+5-2*1=6 說到這三種運算子,在oracle中也有它們的身影。 可以在utl_raw中得到,但是不同之處在於型別是raw,需要資料進位制的轉換。 SQL> desc utl_raw FUNCTION BIT_AND RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R1 RAW IN R2 RAW IN FUNCTION BIT_COMPLEMENT RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R RAW IN FUNCTION BIT_OR RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R1 RAW IN R2 RAW IN FUNCTION BIT_XOR RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R1 RAW IN R2 RAW IN 舉一個例子,還是以3 和 5 為運算量,這個時候需要用到hextoraw這個函式,這個函式是十六進位制轉換的函式。 所以hextoraw(3)實際是 十六進位制:3 十進位制:3(3) 二進位制:00011 同理,hextoraw(5)的二進位制為101 使用utl_raw得到的情況就是 select utl_raw.bit_and(hextoraw(3),hextoraw(5)) from dual 結果類似於使用bitand的結果 select bitand(3,5) from dual 二進位制的運算都是有一定的實際使用意義的,在後續的博文中繼續分享,歡迎關注。